web-dev-qa-db-ja.com

前回のコミットに戻すには、 'git reset --hard HEAD'をどのように使用しますか?

私はGitが自分のアプリケーションに加えた変更を追跡し、変更をコミットするまでその変更を保持していることを知っていますが、ここでハングアップしたところです

以前のコミットに戻したいときは、次のようにします。

git reset --hard HEAD

そしてGitは戻ります:

HEAD is now at 820f417 micro

その後、ハードドライブ上のファイルを以前のコミットに戻す方法を教えてください。

私の次のステップは:

git add .
git commit -m "revert"

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

何をしているのですか?

795
Brian McDonough

まず、git reset --hardは、コミットされていないすべての変更を破棄するので、git statusは潜在的に危険なコマンドです。安全のために、git addの出力が使用される前に常にクリーン(つまり空)であることを確認してください。

最初にあなたは次のように言います:

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

それは間違っています。 Gitは、ファイルをステージングしたとき(git addを使用したとき)またはコミットを作成したときにのみ、ファイルの状態を記録します。プロジェクトファイルを特定の状態にするコミットを作成したら、それらは非常に安全ですが、それまでGitはファイルに対する「変更の追跡」を実際には行いません。 (たとえば、新しいバージョンのファイルをステージングするためにgit reset --hard <SOME-COMMIT>を実行した場合でも、ステージング領域にそのファイルの以前にステージングされたバージョンが上書きされます。)

あなたの質問の中で、あなたはそれから次を尋ねます。

以前のコミットに戻したい場合は、次のように使用します。git reset --hard HEADそしてgitが戻ります:HEADは820f417 microになりました

その後、ハードドライブ上のファイルを以前のコミットに戻す方法を教えてください。

<SOME-COMMIT>を実行した場合、Gitは以下のことを行います。

  • 現在のブランチ(通常はmaster)を<SOME-COMMIT>を指すようにします。
  • それから、作業ツリーとインデックス( "ステージング領域")内のファイルを、git reset --hard HEADでコミットされたバージョンと同じものにします。

HEADはあなたの現在のブランチ(または現在のコミット)を指しているので、f414f31がすることはすべてあなたが行ったコミットされていない変更を捨てることです。

それで、あなたが戻りたいと思う良いコミットがgit logであると仮定してください。 (あなたはそれをgit reset --hard f414f31または任意の履歴ブラウザを通して見つけることができます。)それから、あなたがしたいことに応じていくつかの異なるオプションがあります。

  • 現在のブランチを古いコミットを指すように変更してください。あなたはそれをf414f31で行うことができます。しかし、これはあなたのブランチの歴史を書き換えているので、もしあなたがこのブランチを他の人と共有しているならば、あなたはそれを避けるべきです。また、f414f31の後に行ったコミットは、masterブランチの履歴には含まれなくなります。
  • プロジェクトのgit reset --hard f414f31 git reset --soft HEAD@{1} git commit -m "Reverting to the state of the project at f414f31" とまったく同じ状態を表す新しいコミットを作成しますが、それを履歴に追加するだけなので、履歴を失うことはありません。 この答え - で提案されているステップを使用してそれを行うことができます。

    __コード__
911
Mark Longair

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


これを試して、git clean -fを参照してください。

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

代わりに、@ポールベッツが言ったように、あなたはこれをすることができます(ただし、注意 - それはすべての無視されたファイルも削除します)

  • git clean -df
  • git clean -xdf 注意!無視されたファイルも削除されます
182
uday