Gitで管理されているプロジェクトのローカルな変更をすべて以前の状態に戻すには?

あるプロジェクトでgit initを実行しました。 数回のコミットの後、git statusを実行したところ、すべてが最新で、ローカルでの変更もないことがわかりました。

その後、いくつかの連続した変更を行い、すべてを捨てて元の状態に戻したいと思いました。このコマンドはそれをやってくれるでしょうか?

git reset --hard HEAD
ソリューション

作業コピーに加えた変更を元に戻したい場合は、このようにします。

git checkout .

インデックスに加えた変更を戻したい場合は、次のようにします。Warning this will reset all of your unpushed commits to master!:

git reset

自分がコミットした変更を元に戻したい場合は、次のようにします。

git revert  

トラックされていないファイル(新規ファイルや生成されたファイルなど)を削除したい場合は、次のようにします。

git clean -f

または、トラックされていないディレクトリ(例:新規ファイルや自動生成されたディレクトリ)を

git clean -fd
解説 (19)

注:また、次のように実行することもできます。

git clean -fd

として

git reset --hard

はトラックされていないファイルを *削除しません。一方、git-clean はトラックされているルートディレクトリから git トラッキングされていないファイルを削除します。警告 - これには注意が必要です!最初に git-clean のドライランを行い、何を削除するのかを確認しておくとよいでしょう。

これは、次のようなエラーメッセージが出たときにも役立ちます。

~"performing this command will cause an un-tracked file to be overwritten"

これはいくつかのことをしているときに発生する可能性があります。一つは、あなたと友人が同じ名前の新しいファイルを追加したが、友人はそれを先にソースコントロールにコミットしており、あなたはトラックされていないコピーを削除することを気にしていないときに、作業コピーを更新することです。

このような場合、ドライランを行うことで、上書きされるファイルのリストを表示することができます。

解説 (4)

git-reflog を見てみましょう。 これは、記憶しているすべての状態をリストアップしてくれます (デフォルトは 30 日間)。 たとえば、以下のようになります。

$ git init > /dev/null
$ touch a
$ git add .
$ git commit -m"Add file a" > /dev/null
$ echo 'foo' >> a
$ git commit -a -m"Append foo to a" > /dev/null
$ for i in b c d e; do echo $i >>a; git commit -a -m"Append $i to a" ;done > /dev/null
$ git reset --hard HEAD^^ > /dev/null
$ cat a
foo
b
c
$ git reflog
145c322 HEAD@{0}: HEAD^^: updating HEAD
ae7c2b3 HEAD@{1}: commit: Append e to a
fdf2c5e HEAD@{2}: commit: Append d to a
145c322 HEAD@{3}: commit: Append c to a
363e22a HEAD@{4}: commit: Append b to a
fa26c43 HEAD@{5}: commit: Append foo to a
0a392a5 HEAD@{6}: commit (initial): Add file a
$ git reset --hard HEAD@{2}
HEAD is now at fdf2c5e Append d to a
$ cat a
foo
b
c
d
解説 (4)