Gitは私がアプリケーションに加えた変更を追跡し、変更をコミットするまで保持することは知っていますが、ここで私は悩んでいます。
以前のコミットに戻したいときは、次のようにします。
前のコミットに戻したいときには、次のようにします:
git reset --hard HEAD
すると、Git は次のように返します。
HEAD is now at 820f417 micro
では、ハードドライブ上のファイルをその前のコミットに戻すにはどうしたらいいでしょうか?
私の次のステップは
git add .
git commit -m "revert"
しかし、私のハードドライブ上ではどのファイルも変化していません...。
私のやっていることは正しいのか間違っているのか?
まず、git reset --hard
は、コミットされていない変更をすべて捨ててしまうので、潜在的に危険なコマンドであることを常に指摘しておきましょう。安全のため、使用する前に git status
の出力がクリーンであること(つまり空であること)を常に確認する必要があります。
最初は以下のように言います。
つまり、Git は私がアプリケーションに加えた変更を追跡し、私がその変更をコミットするまで保持するということはわかったのですが、ここで困ったことがあります。
それは間違っています。Git がファイルの状態を記録するのは、(git add
で) ファイルをステージしたときと、コミットを作成したときだけです。プロジェクトのファイルを特定の状態にするコミットを作成したら、それはとても安全ですが、それまではGitは実際にはファイルの「変更を追跡」していません。(たとえば、git add
でファイルの新しいバージョンをステージしたとしても、ステージングエリアにある以前にステージされたバージョンのファイルは上書きされてしまいます)。
質問の中で、あなたは次のように質問しています。
以前のコミットに戻したいときは次のようにします。 git reset --hard HEAD そして git は次のように返します。HEAD is now at 820f417 micro
では、ハードディスク上のファイルを以前のコミットに戻すにはどうすればよいのでしょうか?
git reset --hard
master
) を <SOME-COMMIT>
の時点に戻します。HEADはあなたの現在のブランチ(または現在のコミット)を指しているので、
git reset --hard HEAD` がすることは、あなたがコミットしていない変更をすべて捨ててしまうことになります。
つまり、戻りたい良いコミットが f414f31
だとしましょう。(これは git log
やヒストリーブラウザで確認できます。) 何をしたいかによって、いくつかの異なる選択肢があります。
現在のブランチを変更して、古いコミットを指すようにする。git reset --hard f414f31で行うことができます。しかし、これはあなたのブランチの歴史を書き換えることになるので、このブランチを誰かと共有している場合は避けたほうがいいでしょう。また、
f414f31の後に行ったコミットは、
master` ブランチの履歴に残らなくなります。
f414f31
とまったく同じ状態のプロジェクトを表す新しいコミットを作成しますが、履歴に追加するだけなので、履歴を失うことはありません。この回答]1で提案されている手順を使って、次のように行うことができます。
git reset --hard f414f31
git reset --soft HEAD@{1}。
git commit -m "Reverting to the state of the project at f414f31"
**警告:
git clean -f
はトラックされていないファイルを削除します。この操作を行う前に、本当にトラックされていないファイルをすべて削除したいかどうかを確認してください。
これを試して、git clean -f
を見てみましょう。
git reset --hardは追跡されていないファイルを削除しませんが、
git-clean` は追跡されているルートディレクトリから Git の追跡下にないファイルをすべて削除します。
あるいは、@Paul Betts が言ったように、次のようにすることもできます (注意してください。無視されたファイルもすべて削除されてしまいます)。
git clean -df
git clean -xdf
CAUTION!無視されたファイルも削除されてしまいます。