web-dev-qa-db-ja.com

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

Gitでコミットを取り消そうとしました。 git reset --hard HEAD~1を使用するのは危険ですか?

git resetのさまざまなオプションの違いは何ですか?

37
mesutali

git resetは、5つの「モード」を知っています:ソフト、混合、ハード、マージ、キープ。これらは通常出会うモードなので、最初の3つから始めます。その後、素敵な小さなボーナスが見つかるので、お楽しみに。

soft

git reset --soft HEAD~1を使用すると、現在のブランチから最後のコミットが削除されますが、ファイルの変更は 作業ツリー のままになります。また、変更はインデックスにとどまるため、git commitを続けると、以前に「削除」したコミットとまったく同じ変更でコミットが作成されます。

混合した

これはデフォルトのモードで、ソフトに非常に似ています。 git reset HEAD~1を使用してコミットを「削除」する場合、作業ツリーでは変更を保持しますが、インデックスでは保持しません。そのため、コミットを「やり直し」たい場合は、コミットする前に変更(git add)を追加する必要があります。

ハード

git reset --hard HEAD~1を使用すると、最後のコミットで導入された変更に加えてコミットされていないすべての変更を失うになります。変更は作業ツリーに留まらないため、git statusコマンドを実行すると、リポジトリに変更がないことがわかります。

これを慎重に踏んでください。 gitによって追跡されなかったコミットされていない変更を誤って削除した場合(話す:コミットまたは少なくともインデックスに追加された場合)、gitを使用して元に戻す方法はありません。

ボーナス

保つ

git reset --keep HEAD~1は興味深い便利なものです。 currentHEADと指定されたコミットの間で異なるファイルのみをリセットします。これらのファイルのいずれかにコミットされていない変更がある場合、リセットが中止されます。基本的に、hardのより安全なバージョンとして機能します。

このモードは、多くの変更があり、これらの変更を失うことなく別のブランチに切り替える場合、たとえば、間違ったブランチで作業を開始した場合などに特に便利です。


詳細については git reset documentation をご覧ください。


git resetを実行してコミットを削除する場合、コミットは実際には失われませんが、それまたはその子を指す参照はありません。 git resetなどのコマンドを使用して、SHA-1キーを見つけることにより、git reflogで「削除」されたコミットを回復できます。

87
Sascha Wolf

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

http://git-scm.com/blog/2011/07/11/reset.html

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

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

4
FamiliarPie

Gitのリセットには、5つの主なモードがあります:ソフト、混合、マージ、ハード、キープ。それらの違いは、変更するか変更しないかですhead、stage(index)、working directory

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

つまり、コミットを取り消す場合は、-softで十分です。ただし、それ以降は、インデックスと作業ディレクトリに不正なコミットによる変更が残っています。ファイルを修正し、修正し、インデックスに追加して再度コミットできます。

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

3
apadana

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

--soft

インデックスファイルや作業ツリーにはまったく触れません(ただし、すべてのモードがそうであるように、頭をにリセットします)。これにより、変更されたすべてのファイルが「コミットされる変更」のままになります。これは、gitステータスに記載されているためです。

--hard

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

0
Alexandr