私はGitが自分のアプリケーションに加えた変更を追跡し、変更をコミットするまでその変更を保持していることを知っていますが、ここでハングアップしたところです
以前のコミットに戻したいときは、次のようにします。
git reset --hard HEAD
そしてGitは戻ります:
HEAD is now at 820f417 micro
その後、ハードドライブ上のファイルを以前のコミットに戻す方法を教えてください。
私の次のステップは:
git add .
git commit -m "revert"
しかし、どのファイルも私のハードドライブ上では変更されていません...
何をしているのですか?
まず、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"
とまったく同じ状態を表す新しいコミットを作成しますが、それを履歴に追加するだけなので、履歴を失うことはありません。 この答え - で提案されているステップを使用してそれを行うことができます。
__コード__
警告:
git clean -f
は追跡されていないファイルを削除します。つまり、リポジトリに保存されていないため、捨てられているということです。これを行う前に、本当にすべての未追跡ファイルを削除したいことを確認してください。
これを試して、git clean -f
を参照してください。
git reset --hard
は追跡されていないファイルを削除しませんが、git-clean
は追跡されたルートディレクトリからGit追跡の対象外のファイルを削除します。
代わりに、@ポールベッツが言ったように、あなたはこれをすることができます(ただし、注意 - それはすべての無視されたファイルも削除します)
git clean -df
git clean -xdf
注意!無視されたファイルも削除されます