gitでコミットを元に戻そうとしました。使用するのは危険git reset --hard HEAD~1
ですか?
の異なるオプションの違いは何git reset
ですか?
回答:
git reset
ソフト、混合、ハード、マージ、キープの5つの「モード」を知っています。これらは通常遭遇するモードであるため、最初の3つから始めます。その後、ちょっとしたボーナスがありますので、お楽しみに。
使用git reset --soft HEAD~1
する場合、現在のブランチから最後のコミットを削除しますが、ファイルの変更は作業ツリーに残ります。また、変更はインデックスに残ります。したがって、aを続けるgit commit
と、前に「削除」したコミットとまったく同じ変更でコミットが作成されます。
これはデフォルトのモードであり、ソフトと非常によく似ています。コミットを「削除」する場合git reset HEAD~1
でも、変更は作業ツリーに保持されますが、インデックスには保持されません。したがって、コミットを「やり直す」場合は、コミットするgit add
前に変更()を追加する必要があります。
使用git reset --hard HEAD~1
すると、最後のコミットで導入された変更に加えて、コミットされていないすべての変更が失われます。変更は作業ツリーに残りません。そのため、git status
コマンドを実行すると、リポジトリに変更がないことがわかります。
これで慎重に踏みます。追跡されたことのないコミットされていない変更を誤って削除した場合git
(話す:コミットされたか、少なくともインデックスに追加された)、を使用してそれらを元に戻す方法はありませんgit
。
git reset --keep HEAD~1
面白くて便利なものです。現在の HEAD
コミットと指定されたコミットの間で異なるファイルのみをリセットします。これらのファイルのいずれかにコミットされていない変更がある場合、リセットは中止されます。これは基本的に、のより安全なバージョンとして機能しhard
ます。
このモードは、多数の変更があり、これらの変更を失うことなく別のブランチに切り替えたい場合、たとえば、間違ったブランチで作業を開始した場合に特に便利です。
詳細については、gitresetのドキュメントをご覧ください。
注
やってgit reset
本当に失われていないコミットコミット削除するには、ちょうどそれまたはそれの子のいずれかへの参照ポインティングはありません。git reset
たとえば、などのコマンドを使用してSHA-1キーを見つけることにより、「削除」されたコミットを回復できgit reflog
ます。
--hard
ますが、--keep
はるかに安全で、機能するほとんどのシナリオに適用されるため、正しいことはほとんどありません--hard
。使用--keep
するために指を訓練することはあなたを救うかもしれません、ある日...
keep
。;)
Gitリセットには、ソフト、混合、マージ、ハード、キープの5つのメインモードがあります。それらの違いは、ヘッド、ステージ(インデックス)、作業ディレクトリを変更するかどうかです。
Git reset --hardは、ヘッド、インデックス、および作業ディレクトリを変更します。
Gitリセット--softはヘッドのみを変更します。インデックス、作業ディレクトリへの変更はありません。
つまり、コミットを元に戻したい場合は、-softで十分です。しかし、その後も、インデックスと作業ディレクトリに不正なコミットからの変更があります。ファイルを変更、修正し、インデックスに追加して、再度コミットすることができます。
--hardを使用すると、プロジェクトで完全にきれいな状態になります。前回のコミットから変更がないかのように。これがあなたが望むものであると確信しているなら、次に進んでください。ただし、これを行うと、最後のコミットが完全に失われます。(注:失われたコミットを回復する方法はまだあります)。
これは、resetコマンドの説明をグラフィカルに示す便利な記事です。
https://git-scm.com/docs/git-reset
リセット--hardは、チェックせずに作業コピーを上書きするため、非常に危険な場合があります。したがって、ファイルをまったくコミットしていない場合、ファイルは失われます。
ソースツリーに関しては、コミットを元に戻す方法はありません。とにかくカバーの下でリセットを使用する可能性が最も高いでしょう
git reset --help
、(私の意見では)5つのモード、または少なくともOPから要求された2つのモードを非常によく説明していることにも言及します。