git:新しいファイルを含むすべての作業ディレクトリの変更を元に戻します


1151

新しい追跡されていないファイルを含むすべての変更を作業ディレクトリから削除する方法。私はそれを知ってgit checkout -fいますが、最後のコミット以降に作成された新しい追跡されていないファイルは削除されません。

誰かがそれを行う方法を知っていますか?


1
@Joel&ウェイファーラー:なぜあなたがしようとしないgit help resetgit help clean
SHernandez

3
git configでこれのエイリアスを作成することをお勧めします;)
anubina '

回答:


1699
git reset --hard # removes staged and working directory changes

## !! be very careful with these !!
## you may end up deleting what you don't want to
## read comments and manual.
git clean -f -d # remove untracked
git clean -f -x -d # CAUTION: as above but removes ignored files like config.
git clean -fxd :/ # CAUTION: as above, but cleans untracked and ignored files through the entire repo (without :/, the operation affects only the current directory)

実際に削除せずに、何が削除されるかを事前に確認するには、-nフラグを使用します(これは基本的にテスト実行です)。実際に削除する準備ができたら、-nフラグを削除します。

git clean -nfd


16
注:git reset --hardは、段階的な変更と作業ディレクトリの変更を削除します。また、git clean -f -dは、おそらく新しい追跡されていないファイルを追加するよりも正反対です。質問から、質問者は無視されたファイルの現在のセットに非常に満足している可能性があります。
CBベイリー

7
次の回答を読み、-xスイッチに注意してください。(password / db-settingsファイルなどのローカル設定も削除される可能性があります。例:database.yml)
Boris

9
この-xスイッチは不要であり、この場合は多少危険です。
Tim Gautier

66
git clean -fxd何をしているのかわからない場合、実際には非常に危険です。データベースなど、非常に重要な追跡されていないファイルを完全に削除してしまう可能性があります。注意してください。
メイソンスチュワート

10
git clean -f -d無視されたフォルダからもファイルを削除することに注意してください。つまり、ローカルログなどはすべてなくなります。通常、それは大きな問題ではありませんが、知っておくとよいでしょう。
cyriel 2013年

299

私が頻繁に使用する最も安全な方法:

git clean -fd

/docs/git-cleanページごとの構文の説明:

  • -f(エイリアス:)--force。Git構成変数clean.requireForceがfalseに設定されていない場合、-f、-n、または-iを指定しない限り、git cleanはファイルまたはディレクトリの削除を拒否します。2番目の-fが指定されない限り、Gitは.gitサブディレクトリまたはファイルを含むディレクトリの削除を拒否します。
  • -d。追跡されていないファイルに加えて、追跡されていないディレクトリを削除します。追跡されていないディレクトリが別のGitリポジトリによって管理されている場合、デフォルトでは削除されません。そのようなディレクトリを本当に削除したい場合は、-fオプションを2回使用します。

コメントで述べたように、git clean -nd実際に削除する前に、何を削除して何を削除するかを教えてくれる予行演習を行うことが望ましい場合があります。

git cleanドキュメントページへのリンク:https : //git-scm.com/docs/git-clean


124
私はいつもgit clean -nd .実際にファイルを削除する前にgit clean -fd .
tbear

14
どうして?詳細を教えてください。
グレッグB

31
gitごとのclean -nオプションは、実際には何も削除しないドライランであり、何が行われるかを示すだけです。
RNickMcCandless 2014

2
@tbear、あなたは常に空白を行うことができますadd -A+ commit -a+ revert head最初の前にgit clean。削除を1つ1つ確認することは、主要なシナリオに対応できません。また、空走は特効薬ではありません。レビュー中に何かを見逃したり、間違えたりした場合はどうなりますか?
Pacerier、2015年

1
これによりファイルは削除されますが、変更は取り消されません。
ドンキホーテ

202

すべてのために ステージングされていないファイルを使用します。

git checkout -- .

.最後には重要です。

.プロジェクトの特定のサブディレクトリのみをクリアするために、サブディレクトリ名で置き換えることができます。問題は特にここで扱われます


7
@Vincent:--パラメータが指定されていないことをcheckoutコマンドに通知することにより、入力エラーを回避します。それらがなければ、現在のブランチをリセットする代わりに、新しいブランチで終了することができます!
イゴールロドリゲス

2
これが最も安全な方法ですが、追跡されていないファイル(新しく追加されたファイル)は削除されません。
TinkerTenorSoftwareGuy 2016年

5
これにより、削除されたがコミットされていないファイルは復元されません。
Cerin

参考までに。私はこれを逃した。ステージングされていない変更を削除するディレクトリにいることを確認してください。たとえば、ブランチの異なる場所にある2つの異なるファイル、つまり:src/app/work/filename.jsとに変更がありました../app/working/test/filename.jsgit checkout -- .ブランチで使用すると、最初のファイルのみが削除されます(先頭の../なし)。そのcd ../ため、そのコマンドを使用して2番目のファイルを削除するために、2番目のロケーションディレクトリに移動する必要がありました。
Chris22、18年

57

git cleanコマンドを見てください。

git-clean-作業ツリーから追跡されていないファイルを削除する

現在のディレクトリから始めて、バージョン管理されていないファイルを再帰的に削除して、作業ツリーをクリーンアップします。

通常、gitに認識されないファイルのみが削除されますが、-xオプションが指定されている場合、無視されたファイルも削除されます。これは、たとえば、すべてのビルド製品を削除するのに役立ちます。


私はgit clean -iメニューから「クリーン」を試して選択しました-これは最終的に新しいファイルを削除しました。
Sany

43

次の作品:

git add -A .
git stash
git stash drop stash@{0}

これにより、ステージングされていないローカル変更とステージングされたローカル変更の両方が破棄されることに注意してください。したがって、これらのコマンドを実行する前に、保持したいものはすべてコミットする必要があります。

典型的な使用例:多くのファイルまたはディレクトリを移動した後、元の状態に戻したい場合。

クレジット:https : //stackoverflow.com/a/52719/246724


1
なぜ単にstash @ {0}を参照するのgit stash dropですか?
マイケル2014年

正直なところ、覚えていません:)
donquixote

これはうまくいきました。注として、ホームディレクトリ(git add -A .)にいることを確認してください。ファイルが一致しなかったので、30mを失いました。ありがとう!
user9869932

以前はこのアプローチを使用していましたが、それにはメリットがあります。しかし、それ以来、jfountainとHeath Duttonによって提案されたソリューションが、元の問題であるIMHOに適していることがわかりました。
HeyZiko 2016年

2
git stash drop stash @ {0}は、最新のstashをドロップします(git stashを実行した場合、すべてのstashがドロップされます
DonatasD

42

これは、次の2つの手順で実行できます。

  1. 変更されたファイルを元に戻す: git checkout -f
  2. 追跡されていないファイルを削除します。 git clean -fd

3
シンプルだから+1。また、それが機能し、OPがomgで怖がることなくOPが望んでいることを正確に実行するため、すべてが削除されます。
geekzster

30

私はそれがそうだと思った(警告:以下すべて一掃します

$ git reset --hard HEAD
$ git clean -fd

reset変更を元に戻します。cleanすべての人跡未踏削除するFのジルとDの irectoriesを。


これは機能しません。git pull後で行うと、引き続き競合警告が表示CONFLICT (content): Merge conflict in...されます。私はこれを次の方法で解決しただけですgit pull --strategy=ours
rubo77


4

git clean -i削除するアイテムが最初に表示され、確認後に続行します。これは、誤って削除してはならない重要なファイルを処理するときに役立ちます。

git help cleanその他の便利なオプションを含む詳細については、を参照してください。


4

すべての変更を破棄する場合は、のエイリアスで有効なオプションを使用できます.gitconfig。例えば:

[alias]
    discard = "!f() { git add . && git stash && git stash drop stash@{0}; }; f"

使用法: git discard


1
このエイリアスはとても気に入っています
フラグ

3

代替ソリューションは、変更をコミットしてから、それらのコミットを取り除くことです。これには、最初はすぐにメリットはありませんが、チャンクでコミットし、バックアップ用のgitタグを作成する可能性が広がります。

次のように、現在のブランチでそれを行うことができます:

git add (-A) .
git commit -m"DISCARD: Temporary local changes"
git tag archive/local-changes-2015-08-01  # optional
git revert HEAD
git reset HEAD^^

または、デタッチされたHEADでも実行できます。(BRANCHNAMEブランチで開始すると想定):

git checkout --detach HEAD
git add (-A) .
git commit -m"DISCARD: Temporary local changes"
git tag archive/local-changes-2015-08-01  # optional
git checkout BRANCHNAME

ただし、私が通常行うことは、チャンクでコミットすることで、その一部またはすべてのコミットに「DISCARD:...」という名前を付けます。次に、インタラクティブなリベースを使用して、不良コミットを削除し、良好なコミットを維持します。

git add -p  # Add changes in chunks.
git commit -m"DISCARD: Some temporary changes for debugging"
git add -p  # Add more stuff.
git commit -m"Docblock improvements"
git tag archive/local-changes-2015-08-01
git rebase -i (commit id)  # rebase on the commit id before the changes.
  # Remove the commits that say "DISCARD".

これはより詳細ですが、破棄する変更を正確に確認できます。

git lolそしてgit lolaショートカットは、このワークフローで非常に参考にされています。



0

これはおそらくnoobの答えですが、私はWindowsにTortoiseGitを使用しており、REVERTと呼ばれる優れた機能を備えています。したがって、ローカルのステージングされていないプッシュされていない変更を元に戻すには、次のようにします。

  1. 必要なフォルダーのコンテキストメニューを表示して[元に戻す]を選択すると、元に戻す/回復する変更されたファイルを選択できる[元に戻す]ポップアップが表示されます。
  2. 追加されたファイル(まだgitにない)も削除したい場合は、(同じコンテキストメニューから)[コミット]をクリックすると、[コミット]ポップアップが表示され、追加されたファイルが表示されます。次に、各ファイルを右クリックして[削除]を選択します。ただし、このポップアップではCommit btnを押さないでください。コミットしたくないので、追加されたファイルのみを表示して、ここから削除します。
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.