'git reset --hard HEAD〜1'と 'git reset --soft HEAD〜1'の違いは何ですか?


回答:


184

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ます。


1
私はこれらの3つが私たちが通常使用すべきものであることに同意しません。これらは最初に利用可能になった3つであるため、人々はこれら3つについてさらに話し--hardますが、--keepはるかに安全で、機能するほとんどのシナリオに適用されるため、正しいことはほとんどありません--hard。使用--keepするために指を訓練することはあなたを救うかもしれません、ある日...
Matthieu Moy 2015年

私はそれら使用すべきだと提案しようとはしませんでした。単にこれらがほとんどの場合に遭遇するコマンドであるということです。必要に応じて、自由に回答を編集してください。
Sascha Wolf

gitのを使用して、HEAD〜1 --soft gitのリセット後、もう少し詳細を追加するには、最後にここに示されているように保存古いインデックスにコミット再利用するために、メッセージ--reuse = HEAD @ {1}コミットstackoverflow.com/a/ 25930432/2883282
englealuze

3
@ MatthieuMoy、3年遅れましたが、に関するセクションを追加しましたkeep。;)
Sascha Wolf

最後のコミットを元に戻すにはどうすればよいですか?助けてください。git reset --soft HEAD〜1を使用すると、次のようになります。致命的:あいまいな引数 'HEAD〜1':不明なリビジョンまたはパスが作業ツリーにありません。次のように、「-」を使用してパスをリビジョンから分離します。'git<command> [<revision> ...]-[<file> ...] '
elvis

8

Gitリセットには、ソフト、混合、マージ、ハード、キープの5つのメインモードがあります。それらの違いは、ヘッド、ステージ(インデックス)、作業ディレクトリを変更するかどうかです。

Git reset --hardは、ヘッド、インデックス、および作業ディレクトリを変更します。
Gitリセット--softはヘッドのみを変更します。インデックス、作業ディレクトリへの変更はありません。

つまり、コミットを元に戻したい場合は、-softで十分です。しかし、その後も、インデックスと作業ディレクトリに不正なコミットからの変更があります。ファイルを変更、修正し、インデックスに追加して、再度コミットすることができます。

--hardを使用すると、プロジェクトで完全にきれいな状態になります。前回のコミットから変更がないかのように。これがあなたが望むものであると確信しているなら、次に進んでください。ただし、これを行うと、最後のコミットが完全に失われます。(注:失われたコミットを回復する方法はまだあります)。


5

これは、resetコマンドの説明をグラフィカルに示す便利な記事です。

https://git-scm.com/docs/git-reset

リセット--hardは、チェックせずに作業コピーを上書きするため、非常に危険な場合があります。したがって、ファイルをまったくコミットしていない場合、ファイルは失われます。

ソースツリーに関しては、コミットを元に戻す方法はありません。とにかくカバーの下でリセットを使用する可能性が最も高いでしょう


公式ドキュメントへのリンクは+1。またgit reset --help、(私の意見では)5つのモード、または少なくともOPから要求された2つのモードを非常によく説明していることにも言及します。
ThanksForAllTheFish 2014

1
リンクが壊れています。おそらくこれは、現在のバージョンは次のとおりです。git-scm.com/docs/git-reset
キキジュエル

1

これは、使用git reset--hardgitreset -- softの主な違いです。

--soft

インデックスファイルまたは作業ツリーにはまったく触れません(ただし、すべてのモードと同様に、ヘッドをにリセットします)。これにより、変更されたすべてのファイルが「変更をコミットする」ままになります。これは、gitstatusが示すとおりです。

--hard

インデックスと作業ツリーをリセットします。作業ツリー内の追跡ファイルへの変更は破棄されます。


1
これが私が探していたものです。簡潔で正確。
カシム
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.