ローカルGitの変更を削除するさまざまな方法


625

私はgitリポジトリのクローンを作成し、ブランチをチェックアウトしました。私はそれに取り組んだ後、元のコピーが欲しいので、ローカルの変更をすべて削除することにしました。

つまり、ローカルの変更を削除するには、次の2つのコマンドを実行する必要がありました。

git checkout .

git clean -f

私の質問は、

(1)これはローカルな変更を取り除くための正しいアプローチですか、それとも正しいアプローチを教えてください。

(2)git reset --hardこのコマンドなしでもリセットできるのでいつ使用するのですか?

ありがとう

*解決策:メジャー編集:03/26:* 曖昧な用語の多くをgit固有の用語に置き換え[追跡/追跡解除/ステージング/ステージング解除]

ローカルで変更を加える場合、ファイルのカテゴリは3つしかありません。

タイプ1.ステージングされた追跡ファイル

タイプ2.ステージングされていない追跡ファイル

タイプ3. Unstaged UnTracked files aka UnTracked files

  • ステージング済み-ステージング領域に移動されたもの/インデックスに追加されたもの
  • 追跡-変更されたファイル
  • UnTracked-新しいファイル。常にステージングされていません。ステージングされている場合は、追跡されていることを意味します。

各コマンドの機能:

  1. git checkout . -ステージングされていない追跡ファイルのみを削除します[タイプ2]

  2. git clean -f -Unstaged UnTrackedファイルのみを削除します[タイプ3]

  3. git reset --hard -段階的追跡ファイルと非段階的追跡ファイルのみを削除します[タイプ1、タイプ2]

  4. git stash -u -すべての変更を削除します[タイプ1、タイプ2、タイプ3]

結論:

どちらかを使用できることは明らかです

(1) combination of `git clean -f` and `git reset --hard` 

または

(2) `git stash -u`

望ましい結果を達成するため。

注:「隠しておく」とは、「(何か)を安全かつ特定の場所に安全に保管する」という意味です。これは常にを使用して取得できますgit stash pop。したがって、上記の2つのオプションから選択することは、開発者の呼び出しです。

ChristophとFrederikSchøningに感謝します。

編集:03/27

注意」のメモを書いておく価値があると思いましたgit clean -f

git clean -f

後戻りはありません。-nまたは--dry-runを使用して、行うダメージをプレビューします。

ディレクトリも削除したい場合は、 git clean -f -d

無視したファイルを削除したいだけの場合は、 git clean -f -X

無視されたファイルと無視されていないファイルを削除する場合は、次を実行します。 git clean -f -x

参照:詳細git clean現在のGit作業ツリーからローカル(追跡されていない)ファイルを削除する方法

編集:05/20/15

このブランチのすべてのローカルコミットを破棄する [ローカルコミットを削除する]

このブランチのすべてのローカルコミットを破棄して、ローカルブランチをこのブランチの「上流」と同一にするには、次のコマンドを実行します。 git reset --hard @{u}

リファレンス:http : //sethrobertson.github.io/GitFixUm/fixup.html

またはgit reset --hard origin/master[ローカルブランチがの場合master]

注:2015年6月12日 これは、重複としてマークされている他のSO質問の重複ではありません。この質問では、ローカルGITの変更を削除する方法について説明します[追加されたファイルを削除する、既存のファイルに追加された変更を削除するなど]およびさまざまなアプローチ。他のSOスレッドでは、ローカルコミットを削除する方法のみを扱います。ファイルを追加し、それだけを削除したい場合、他のSOスレッドはそれについて議論しません。したがって、これは他のものの複製ではありません]

編集:06/23/15

すでにリモートリポジトリにプッシュされているコミットを元に戻す方法は?

$ git revert ab12cd15

編集:09/01/2015

ローカルブランチとリモートブランチから以前のコミットを削除します

ケース:ローカルブランチに変更をコミットし、すぐにリモートブランチにプッシュしました。この変更は必要ありません。今何をしますか?

git reset --hard HEAD~1 [ローカルブランチからそのコミットを削除するため]

git push origin HEAD --force[両方のコマンドを実行する必要があります。リモートブランチから削除する場合]

ブランチはどうですか?現在チェックアウトされているブランチです。

20159月8編集 -ローカルのgit マージを削除ます:

私はブランチにいて、新しく機能するブランチとmasterブランチをマージmasterしましたphase2

$ git status
# On branch master

$ git merge phase2

$ git status
# On branch master
# Your branch is ahead of 'origin/master' by 8 commits.

Q:このマージを取り除くにはどうすればよいですか?試したところgit reset --hardgit clean -d -f どちらも機能しませんでした。

唯一働いは、以下のもののいずれかであります:

$ git reset --hard origin/master

または

$ git reset --hard HEAD~8

または

$ git reset --hard 9a88396f51e2a068bb7 [sha commit code-これは、すべてのマージコミットが発生する前に存在していたコードです]


1
:私は、このスレッドは、あなたの質問に答えるかもしれないと思いstackoverflow.com/questions/1146973/...
Saucier

1
「git stash」は、行った変更をすべて削除します。
John Ballinger、2014年

1
いいまとめ!「タイプ4無視されたファイル」という別のファイルカテゴリを追加します。git stash -a[または--all]は、無視され追跡されていないファイルも隠します。git clean -x無視されたファイルもクリーンアップします。git clean -X無視されたファイルのみをクリーンアップします。
Jerry101

2
@JavaDev質問は回答のようなものでした。編集を続け、すべての回答を編集してくださったことに感謝します。
Bhavuk Mathur

1
おかげでローカルの変更を元に戻すために4つのコマンドをすべて実行しました
Vincent Tang

回答:


505

それはすべて、元に戻す/元に戻そうとしている内容に完全に依存します。まず、宇部のリンクの投稿を読んでください。しかし、答えを試すには:

ハードリセット

git reset --hard [HEAD]

追跡されたファイルに対するすべての段階的および段階的でない変更を完全に削除します。

「リモートから完全に再クローンを作成したかのように、すべてを元に戻す」ようなときに、ハードリセットを頻繁に使用しています。あなたの場合、あなたがあなたのレポをそのまま残したいだけなら、これはうまくいくでしょう。

掃除

git clean [-f]

追跡されていないファイルを削除します。

一時ファイルを削除しますが、すでに追跡されているファイルへの段階的および段階的でない変更を保持します。ほとんどの場合、繰り返しクリーンアップする代わりに、おそらくignore-ruleを作成することになります。たとえば、C#プロジェクトのbin / objフォルダーの場合は、通常、スペースを節約するためにリポジトリから除外する必要があります。

-f(強制)オプションも追跡されていないファイル、削除されます無視ルールをかかわらもgitので無視されているが。上記のケースでは、bin / objフォルダーを追跡しないようにするignore-ruleを使用して、これらのフォルダーがgitによって無視されている場合でも、force-optionを使用すると、それらがファイルシステムから削除されます。私は散発的にこれの使用法を見てきました。たとえば、デプロイメントのスクリプトを作成するとき、デプロイする前にコードをクリーンアップしたり、圧縮したりしたいと思っています。

Gitクリーンは、すでに追跡されているファイルには触れません。

チェックアウト「ドット」

git checkout .

私は実際にあなたの投稿を読む前にこの表記を見たことはありませんでした。私はこれに関するドキュメントを見つけるのに苦労しています(たぶん誰かが助けてくれるかもしれません)が、少し遊んでみると、それが意味するように見えます:

「私の作業ツリーのすべての変更を元に戻す」。

つまり、追跡されたファイルのステージングされていない変更を元に戻します。ステージングされた変更には触れず、追跡されていないファイルはそのままにしておきます。

隠しておく

いくつかの回答は隠蔽について言及しています。言い回しが意味するように、何かの途中(コミットの準備ができていない)でスタッシングを使用する可能性があり、一時的にブランチを切り替えるか、コードの別の状態で何らかの方法で作業し、後で「厄介な」状態に戻る必要があります机"。これがあなたの質問に当てはまるとは思えませんが、間違いなく便利です。

総括する

一般に、コミットしてリモートの重要な変更にプッシュしたと確信している場合、単に遊んでいるだけの場合などは、following を使用git reset --hard HEADするgit clean -fと、コードが最終的に状態にクレンジングされます。ブランチからチェックアウトしました。リセットすると、段階的ではあるがコミットされていない変更も削除されることを強調しておくことは本当に重要です。コミットされていないものはすべて消去されます(追跡されていないファイルを除く。この場合はcleanを使用してください)。

他のすべてのコマンドは、より細かい「ものを元に戻す」ことが必要なより複雑なシナリオを容易にするためにあります:)

私は、あなたの質問#1はカバーされているように感じますが、最後に、#2で結論付けgit reset --hardます。変更を行った場合、それを元に戻すことgit checkout .も、git clean -f戻すこともできませんでした。

これでうまくいきますように。


を使用する理由に感謝しますgit reset --hard。私は試してみました。そうです。index(staging)に追加されたファイルはの後git reset --hardでのみ削除されました。デフォルトでgit reset --hardはであると想定していますgit reset --hard head。このリンクも役に立ちましたgitready.com/beginner/2009/01/18/the-staging-area.html
スパイダーマン

git stash -uここで最も理にかなっていると思う理由を改善しました。
Christoph

2
二人ともありがとうございます。回答をまとめ、質問に埋め込みました。クリストフは私が何を知っているgit stash -uとどのようにそれをポップしないが、フレデリク私はハードリセットとの組み合わせを使用して知っているgit reset --hardgit clean -f、なぜいないstashいくつかのシナリオで好ましいです。今、私が答えとしてマークする必要があるものを選択するのを手伝ってください:)、どちらも私の答えです。
スパイダーマン2014年

3
.リポジトリのルートである可能性がある現在の作業ディレクトリを参照するpathspecです。git-scm.comから:git checkout [<tree-ish>] [--] <pathspec>…作業ツリー内の名前付きパスを、インデックスファイルまたは名前付きの<tree-ish>から更新します。
Jerry101

3
などが破壊的であることは十分に強調されたことはgit reset --hardありません。とにかく、答えの小文字を修正してください。大文字であるか、まったく存在しない必要があります。git clean -dfxheadHEAD
PavelŠimerda15年

25

この時点で回答を追加する理由:

これまでのところ、最初の質問自体に結論と「回答」を追加していたため、質問が非常に長くなり、別の回答に移っていました。

私はまた、他の誰かを助けるために、gitで私を助けるより頻繁に使用されるgitコマンドを追加しました。

基本的に、すべてのローカルコミットをクリーンアップし $ git reset --hard$ git clean -d -f


コミットを行う前の最初のステップは、コミットと共に表示されるユーザー名と電子メールを構成することです。

#commitトランザクションに付ける名前を設定します

$ git config --global user.name "[name]"

#commitトランザクションに添付するメールを設定します

$ git config --global user.email "[email address]"

#グローバル設定を一覧表示

$ git config --list

#リモートURLをリストする

$ git remote show origin

#ステータスを確認

git status

#すべてのローカルブランチとリモートブランチを一覧表示する

git branch -a

#新しいローカルブランチを作成し、このブランチの作業を開始します

git checkout -b "branchname" 

または、2ステップのプロセスとして実行できます

ブランチを作成:git branch branchname このブランチで作業します:git checkout branchname

#commitローカル変更 [2ステッププロセス:-ファイルをインデックスに追加します。つまり、ステージング領域に追加します。次に、このステージング領域に存在するファイルをコミットします]

git add <path to file>

git commit -m "commit message"

#他のローカルブランチをチェックアウトする

git checkout "local branch name"

#ローカルブランチのすべての変更を削除する [新しいファイルの追加や既存のファイルの変更、ローカルコミットの作成など、ローカルブランチにいくつかの変更を加えたが、それが不要になった場合] git clean -d -fgit reset --hard [ローカルブランチに加えられたすべてのローカル変更を消去するローカルコミット]

git stash -u すべての変更も削除します

注: (1)git clean –d –fgit reset --hard ORの組み合わせ(2)git stash -u を使用して目的の結果を達成できることは明らかです。

注1:隠しておくという意味は、「(何か)を安全かつ特定の場所に安全に保管する」という意味です。これは常にgit stash popを使用して取得できます。したがって、上記の2つのオプションから選択することは、開発者の呼び出しです。

注2:git reset --hard作業ディレクトリの変更を削除します。このコマンドを実行する前に、保持したいローカルの変更を隠しておいてください。

#マスターブランチに切り替えて、最新の状態であることを確認します。

git checkout master

git fetch [これは、(git設定によっては)origin / masterで更新を受信するために必要になる場合があります]

git pull

#機能ブランチをマスターブランチにマージします。

git merge feature_branch

#マスターブランチをオリジンの状態にリセットします。

git reset origin/master

#誤ってローカルからファイルを削除しました、それを元に戻す方法? a git statusを実行して、削除されたリソースの完全なファイルパスを取得します

git checkout branchname <file path name>

それでおしまい!

#マスターブランチと他のブランチをマージする

git checkout master
git merge someotherbranchname

#ローカルブランチの名前を変更

git branch -m old-branch-name new-branch-name

#ローカルブランチを削除する

git branch -D branch-name

#リモートブランチを削除する

git push origin --delete branchname

または

git push origin :branch-name

#すでにリモートリポジトリにプッシュされたコミットを元に戻す

git revert hgytyz4567

#GITを使用した以前のコミットからの分岐

git branch branchname <sha1-of-commit>

#すでにリモートにプッシュされている最新のコミットのコミットメッセージを変更する

git commit --amend -m "new commit message"
git push --force origin <branch-name>

#このブランチのすべてのローカルコミットを破棄 [ローカルコミットを削除]

このブランチのすべてのローカルコミットを破棄して、ローカルブランチをこのブランチの「上流」と同一にするには、次のコマンドを実行します。

git reset --hard @{u}

参照:http : //sethrobertson.github.io/GitFixUm/fixup.html または実行git reset --hard origin/master[ローカルブランチがマスターの場合]

#すでにリモートリポジトリにプッシュされたコミットを元に戻しますか?

$ git revert ab12cd15

#ローカルブランチとリモートブランチから以前のコミットを削除します

ユースケース:変更をローカルブランチにコミットし、すぐにリモートブランチにプッシュしました。突然、ああ、わかりませんでした。この変更は必要ありません。今何をしますか?

git reset --hard HEAD~1[ローカルブランチからそのコミットを削除するため。1は1つのコミットを示します]

git push origin HEAD --force[両方のコマンドを実行する必要があります。リモートブランチから削除する場合]。現在チェックアウトされているブランチは、この操作を行うブランチと呼ばれます。

#最近のコミットの一部をローカルおよびリモートのリポジトリから削除し、必要なコミットに保持します。(ローカルおよびリモートからコミットを元に戻す一種)

develop」という名前のリモートブランチにプッシュしたコミットが3つあるとします。

commitid-1 done at 9am
commitid-2 done at 10am
commitid-3 done at 11am. // latest commit. HEAD is current here.

古いコミットに戻す(ブランチの状態を変更する)

git log --oneline --decorate --graph //すべてのcommitidを表示します

git clean -d -f //ローカルの変更をすべて消去します

git reset --hard commitid-1 //ローカルでこのcommitidに戻します

git push -u origin +develop//この状態をリモートにプッシュします。+強制的に押します

#ローカルgitマージを削除: ケース:私はマスターブランチにいて、マスターブランチを新しく機能するブランチフェーズ2にマージしました

$ git status

ブランチマスター上

$ git merge phase2 $ git status

ブランチマスター上

あなたのブランチは8つのコミットで 'origin / master'よりも進んでいます。

Q:このローカルgitマージを取り除く方法は?試したところgit reset --hardgit clean -d -fどちらも機能しませんでした。唯一働いは、以下のもののいずれかであります:

$ git reset --hard origin / master

または

$ git reset --hard HEAD〜8

または

$ git reset --hard 9a88396f51e2a068bb7 [sha commit code-これは、すべてのマージコミットが発生する前に存在していたコードです]

#gitignoreファイルを作成

touch .gitignore // MacまたはUNIXユーザーでファイルを作成します

サンプル.gitignoreの内容:

.project
*.py
.settings

GITチートシートへの参照リンク:https : //services.github.com/on-demand/downloads/github-git-cheat-sheet.pdf


1
リモートブランチを削除するコマンドは、最適ではない場合があります。あなたが使用していますがgit push origin :branch-name、私は使用をお勧めしますgit push origin --delete branchname
vibs2006

同意し、あなたの提案で更新しました。ありがとう@ vibs2006
スパイダーマン

21

gitのすべてと同様に、それを行う方法は複数あります。使用した2つのコマンドは、1つの方法です。あなたができるもう一つのことは、単にそれらを隠しておくことgit stash -uです。-u新しく追加されたファイル(人跡未踏)も含まれていることを確認します。

便利なのgit stash -u

  1. それはおそらくあなたの目標を達成するための最も簡単な(唯一の?)単一のコマンドです
  2. 後で気が変わった場合は、すべての作業が元に戻りますgit stash pop(Gmailでメールを削除するようなもので、後で気が変わったら元に戻すことができます)

他の質問でgit reset --hardは、追跡されていないファイルは削除されないため、引き続きが必要になりgit clean -fます。しかし、a git stash -uが最も便利かもしれません。


git reset --hard追跡されていないファイルは実際には削除されませんが、追跡されていない変更、つまりすでにインデックスにあるファイルへの変更削除されます。きっとそういうことだと思います:)
FrederikStruck-Schøning2014年

私が使用したときgit stash -u、私はgit bashからのこの応答を見ました。。「保存されたが、{} branchname上のディレクトリおよびインデックス状態WIPを作業これは、1を保存することがすることは、我々が使用して取得することができるものであるgit stash pop
スパイダーマン

二人ともありがとうございます。回答をまとめ、質問に埋め込みました。クリストフは私が何を知っているgit stash -uとどのようにそれをポップしないが、フレデリク私はハードリセットとの組み合わせを使用して知っているgit reset --hardgit clean -f、なぜいないstashいくつかのシナリオで好ましいです。今、私が答えとしてマークする必要があるものを選択するのを手伝ってください:)、どちらも私の答えです。
スパイダーマン2014年

しかし、追跡したくないファイルをリポジトリに追加した場合はどうなりますか?私のリポジトリでのみ。それを無視リストに追加すると、コミットする.ignoreファイルがあり、他のすべてのユーザーにも影響します。
user20358

7

1.ローカルの変更をまったく保持したくない場合。

git reset --hard

このコマンドは、ローカルリポジトリからすべてのローカル変更を完全に削除します。これは、ローカルでの変更をまったく保持したくない場合にのみ、pullコマンド中に競合を回避する最良の方法です。

2.ローカルの変更を保持したい場合

リモートから新しい変更をプルし、このプル中のローカル変更を無視する場合は、

git stash

ローカルの変更をすべて隠します。これで、リモートの変更をプルできます。

git pull

これで、ローカルの変更を元に戻すことができます。

git stash pop

1
git reset --hardローカルの変更がすべて削除されるわけではありません。変更のみが削除されます。追加を削除する場合は、次のことも行う必要がありますgit clean -fd
John Henckel


4

gitには明確に文書化されていないことが1つあると思います。実際に無視されたと思います。

git checkout .

男、あなたは私の日を救った。修正したコードを使用して、常にやりたいことが常にあります。しかし、変更されたコードをめちゃくちゃにしたり、新しい追跡されていないファイルを追加したりすることが時々あります。したがって、私がやりたいことは、私がやりたいことをステージングし、厄介なことを行って、すぐにクリーンアップして、満足したらコミットします。

ありますgit clean -fd人跡未踏のファイルに適していますが。

その後、git reset単に段階的に削除しますが、git checkoutちょっと面倒です。ファイルを1つずつ指定するか、ディレクトリを使用することが常に理想的であるとは限りません。削除したい変更されたファイルが、保持したいディレクトリ内にある場合があります。私はステージングされていない変更を削除するこの1つのコマンドを望んでいました。ありがとう。

しかし、私は彼らがgit checkoutオプションなしで持っているべきだと思います、ステージングされていないすべての変更を削除し、ステージングに触れないでください。それはちょっとモジュール式で直感的です。何git resetがもっと好き。git clean同じことをする必要があります。


2

最善の方法は、変更をチェックアウトすることです。

project-nameという名前のプロジェクトのpom.xmlファイルを変更すると、次のようになります。

git status

# modified:   project-name/pom.xml

git checkout project-name/pom.xml
git checkout master

# Checking out files: 100% (491/491), done.
# Branch master set up to track remote branch master from origin.
# Switched to a new branch 'master'

2

以下のために、すべての廃棄私は隠しておくと、そのスタッシュをドロップしたい、それはあなたが複数のレポの間で働く場合は特に、すべてを破棄する最速の方法です。

これにより、{0}キーのすべての変更が隠され、即座にドロップされます{0}

git stash && git stash drop


1

まず、重要な変更が保存されたかどうかを確認します。

$ gitステータス

試すより

$ git reset --hard

ブランチをデフォルトにリセットします

ただし、元に戻す必要がある場合:

$ edit(1)$ git add frotz.c filfre.c $ mailx(2)$ git reset
(3)$ git pull git://info.example.com/ nitfol


続きを読む>> https://git-scm.com/docs/git-reset


補足:reset --hardは危険なコマンドです。これによりすべての変更が削除され、元に戻すことはできません。ハードリセットを使用する場合は、ユーザーが注意する必要があります。
ダングリングポインター2017
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.