1131

Gitはアプリケーションに加えた変更を追跡し、変更をコミットするまでGitはそれらを保持することを知っていますが、ここで電話を切ります。

以前のコミットに戻したい場合は、次を使用します。

git reset --hard HEAD

そしてGitは次のように返します。

HEAD is now at 820f417 micro

次に、ハードドライブ上のファイルを以前のコミットに戻すにはどうすればよいですか?

次のステップは次のとおりです。

git add .
git commit -m "revert"

しかし、私のハードドライブ上のファイルはどれも変更されていません...

私は正しい/間違っていることをしていますか?

4

2 に答える 2

1300

まず、これは潜在的に危険なコマンドであることに注意して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 <SOME-COMMIT>、Git は次のことを行います。

  • 現在のブランチ (通常はmaster) を に戻し<SOME-COMMIT>ます。
  • 次に、作業ツリー内のファイルとインデックス (「ステージング エリア」) を でコミットされたバージョンと同じにし<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"
    
于 2012-03-02T08:32:00.687 に答える
272

警告:git clean -f追跡されていないファイルを削除します。つまり、それらはリポジトリに保存されていないため、永久に失われます。これを行う前に、追跡されていないすべてのファイルを本当に削除する必要があることを確認してください。


これを試して見てくださいgit clean -f

git reset --hardは追跡されていないファイルを削除しませんが、asgit-cleanは追跡されたルート ディレクトリから Git 追跡下にないファイルを削除します。

または、@Paul Bettsが言ったように、これを行うことができます(ただし、無視されたファイルもすべて削除されることに注意してください)

  • git clean -df
  • git clean -xdf あぶない!これにより、無視されたファイルも削除されます

フラグの説明:

-dディレクトリ内のすべてのファイルを再帰的に削除します

-f

Git 構成変数 clean.requireForce が false に設定されていない場合、git clean は、-f または -i を指定しない限り、ファイルまたはディレクトリの削除を拒否します。2 番目の -f が指定されない限り、Git は追跡されていないネストされた git リポジトリ (.git サブディレクトリを持つディレクトリ) の変更を拒否します。

-x標準の無視ルールを使用しないでください-e。これを使用して、クリーン ビルドを開始できます。

出典:マニュアルページ

于 2012-03-02T06:48:31.897 に答える