1. ホーム
  2. git

[解決済み] git reset --hard HEAD' を使って以前のコミットに戻すにはどうしたらいいですか?重複] [重複] [重複

2022-03-17 01:32:52

質問

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はファイルへの変更を実際にquot;tracking"していません。(例えば、あなたが git add を実行して新しいバージョンのファイルをステージングすると、ステージングエリアにあるそのファイルの以前のステージングバージョンが上書きされます)。

ご質問の中で、次に次のようなことが書かれていますね。

前のコミットに戻したいときは、次のようにします: git reset --hard HEAD そして、gitは返します。HEAD は現在 820f417 にあります。

ハードディスクにあるファイルをその前のコミットに戻すにはどうしたらいいですか?

もし、あなたが git reset --hard <SOME-COMMIT> であれば、Git はそうします。

  • 現在のブランチ(通常は master を指すように戻す。 <SOME-COMMIT> .
  • そして、作業ツリーとインデックス ("staging area") にあるファイルを、以下の手順でコミットしたバージョンと同じにするのです。 <SOME-COMMIT> .

HEAD は現在のブランチ (あるいは現在のコミット) を指しているので、すべての git reset --hard HEAD を実行すると、コミットされていない変更をすべて捨ててしまいます。

そこで、元に戻したい良いコミットが f414f31 . (それは git log または任意の履歴ブラウザ)。そして、あなたが何をしたいかに応じて、いくつかの異なるオプションがあります。

  • 現在のブランチを変更し、代わりに古いコミットを指すようにします。これを行うには git reset --hard f414f31 . しかし、これはブランチの履歴を書き換えることになるので、このブランチを誰かと共有している場合は避けたほうがよいでしょう。また f414f31 の履歴にはもう残りません。 master ブランチがあります。
  • と全く同じ状態のプロジェクトを表す新しいコミットを作成します。 f414f31 しかし、履歴に追加するだけなので、履歴を失うことはありません。で提案されている手順で、これを行うことができます。 この回答 - のようなものです。

    git reset --hard f414f31
    git reset --soft HEAD@{1}
    git commit -m "Reverting to the state of the project at f414f31"