git reset --hard HEADは追跡されていないファイルを残します


584

私が実行するとgit reset --hard HEAD、私が理解しているように、プルしたものを元のバージョンにリセットすることになっています。残念ながら、git status追跡されていないファイルの大きなリストを表示しているため、ファイルが横になっています。

どのようにgitに「最後のプルにあったものに正確に戻すだけです。


44
git reset --hardインデックスをリセットし、追跡されたファイルをHEADの状態に戻します。追跡されないファイルはそのままにします。
fifigyuri、2010

回答:


904

を使用git clean -f -dして、作業コピー内の追跡されていないファイルとディレクトリを削除する必要があります。

すべてのgitサブモジュールを含め、リポジトリ全体をマスターにリセットする必要がある場合は、次のスクリプトを実行します。

git reset --hard HEAD
git clean -f -d
git checkout master
git fetch origin master
git reset --hard origin/master
git pull
git submodule update
git submodule update --init --recursive
git submodule foreach git reset --hard HEAD
git submodule foreach git clean -f -d
git submodule foreach git submodule update --init --recursive
git submodule foreach git fetch
git submodule foreach git pull
git status

56
また-x、.gitignoredファイルを削除して、元の状態に戻したい場合も同様です。
jtdubs 2010

44
-nテストに追加は最初に削除されます。一つの引数でそれらのすべてを兼ね備え:-dfn
ハイブリッド

31
私の共通のコマンドはgit clean -qfdxここにあります。すべてを削除して、黙ってそれを行います。
aragaer 2013年

3
-d -f二回decalredことができる-dffため-d -f -f、これは保護された人跡未踏ディレクトリを含むすべての人跡未踏のディレクトリを削除します。
ThorSummoner、2015年

3
@BKSpurgeon:はい、ファイルを削除します。「以前と同じように追跡されていないファイルが欲しい」とはどういう意味ですか?Gitは、追跡されていないファイルが存在すること以外は何も知りません。(彼らはので、それは、これらのファイルの複数のバージョンを追跡することはありません人跡未踏)。
knittl

61

保持したいファイルがある場合:

git clean -di インタラクティブなクリーンアップを実行して、不要なファイル/ディレクトリのみを削除できるようにします。


48
git reset --hard && git clean -dfx

または、zshは「gpristine」エイリアスを提供します。

alias gpristine='git reset --hard && git clean -dfx'

これは本当に便利です。

フォークされたリポジトリで作業している場合は、正しいリポジトリ/ブランチからフェッチしてリセットするようにしてください。次に例を示します。

git fetch upstream && git reset --hard upstream/master && git clean -df

8
これが安全なコマンドではない場合は謝罪-私は安全であるようにしようとしていなかった、私は質問に答えようとしていた。これが質問に答えるかどうかコメントできますか?
jjnevis

3
これはうまく機能し、git IMHOに組み込む必要があります(ただし、-xを定期的に使用するかどうかはわかりません)。何度も私はローカルプロジェクトで作業していて、まだgithubなどに同期されていません。また、乱雑なリファクターはIDEの「元に戻す」状態を超えています。私の本能は、最後のコミットに戻ることですが、それをグーグルするには、通常、最後のコミットではなく、最後から2番目のコミットの回答が必要です。私がやりたいのは、最新のコミットに戻ることです。これはそれを行います。しかし、もっと簡単な方法であるべきです。Linus、ありがとう!;-)
デルアンダーソン

5
-xリポジトリのクローンを作成したばかりであれば、無視されたファイルも同様に削除されるので危険です。それがあなたの望むことなら、それは完璧です。追跡されていないファイルを削除したいだけの場合は、-xオプションを削除するとうまくいきます。
エミールベルジェロン2017年

2
神に感謝gpristine
Snowcrash

2
そして、intellij設定を削除します;)
Kalpesh Soni

17

ユーザーインタラクティブなアプローチ:

git clean -i -fd

Remove .classpath [y/N]? N
Remove .gitignore [y/N]? N
Remove .project [y/N]? N
Remove .settings/ [y/N]? N
Remove src/com/amazon/arsdumpgenerator/inspector/ [y/N]? y
Remove src/com/amazon/arsdumpgenerator/manifest/ [y/N]? y
Remove src/com/amazon/arsdumpgenerator/s3/ [y/N]? y
Remove tst/com/amazon/arsdumpgenerator/manifest/ [y/N]? y
Remove tst/com/amazon/arsdumpgenerator/s3/ [y/N]? y

-i(インタラクティブ)
-f(強制)
-d(ディレクトリ)
-x(無視されたファイル)(必要に応じて追加

注: -nまたは--dry-run追加して、機能を確認します。


4

使用できますgit stash。を指定する必要があります。指定--include-untrackedしないと、元の問題が発生します。

git stash --include-untracked

次に、スタッシュの最後のエントリをドロップします

git stash drop

そのための便利なエイリアスを作成して、git wipeたとえば次のように呼び出すことができます。

git config --global alias.wipe "! git stash -q --include-untracked && git stash drop -q"

2

あなたが探しているコマンドは git clean


4
次回は、もう少し説明/例などを追加してください。ユーザーがそれが何をするか、この場合は、どのパラメーターを使用するかを理解するのに役立つものは何でも。
rugk

1

git-clean 作業ツリーで追跡されていないファイルを削除するために使用します。以下は、git cleanコマンドで使用できるいくつかのオプション(要約)です。

-dパスが指定されていない場合に使用します。したがって、追跡されていないディレクトリにgit recurseを実行すると、それらが削除されます。

-f/--force ネストされた追跡されていないファイルを削除します。

-i/--interactive 何が行われるかを示し、ファイルをインタラクティブにクリーンアップします。

-n/--dry-run 何も削除せずに何が起こるかを示します。

-x ファイルを無視する

例:git clean -f -d->現在のディレクトリ内のすべての追跡されていないファイルをサブディレクトリから削除します。


-16

ある時点でソフトリセットを行った可能性があります。この問題を解決するには、

git add .
git reset --hard HEAD~100
git pull

7
これはOPが望んでいたことではないと思います。他の答えはどちらも、これを修正する方法を実際に示すというより良い仕事をします。
エイブリー

1
追加するファイルが多い場合も、これが遅くなる可能性があります。
Devin G Rhode

4
まったく無関係です。
Azeem Hassni

1
これを行うと、追跡されていないファイルが削除されます。しかし、プログラマーとして、誰もが回避策や笑顔を使わずに問題の正しい解決策を見つけるように努めるべきです。
ユレシュKarunanayake
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.