Gitでコミットを取り消そうとしました。 git reset --hard HEAD~1
を使用するのは危険ですか?
git reset
のさまざまなオプションの違いは何ですか?
git reset
は、5つの「モード」を知っています:ソフト、混合、ハード、マージ、キープ。これらは通常出会うモードなので、最初の3つから始めます。その後、素敵な小さなボーナスが見つかるので、お楽しみに。
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
で「削除」されたコミットを回復できます。
これは、リセットコマンドの説明をグラフィカルに示す便利な記事です。
http://git-scm.com/blog/2011/07/11/reset.html
Reset --hardは、チェックせずに作業コピーを上書きするため、非常に危険な場合があります。したがって、ファイルをまったくコミットしていない場合は、ファイルは削除されます。
ソースツリーに関しては、コミットを取り消す方法はありません。とにかくカバーの下でリセットを使用する可能性が高い
Gitのリセットには、5つの主なモードがあります:ソフト、混合、マージ、ハード、キープ。それらの違いは、変更するか変更しないかですhead、stage(index)、working directory。
Gitのリセット--hardは、ヘッド、インデックス、および作業ディレクトリを変更します。
Gitリセット--softは頭のみを変更します。インデックス、作業ディレクトリに変更はありません。
つまり、コミットを取り消す場合は、-softで十分です。ただし、それ以降は、インデックスと作業ディレクトリに不正なコミットによる変更が残っています。ファイルを修正し、修正し、インデックスに追加して再度コミットできます。
--hardを使用すると、プロジェクト内で完全にスレートを取得できます。最後のコミットから変更がなかったかのように。これがあなたが望むものであると確信しているなら、前進してください。ただし、これを行うと、最後のコミットが完全に失われます。 (注:失われたコミットを回復する方法はまだあります)。
これは、使用git reset --hardとgit reset --soft:の主な違いです
--soft
インデックスファイルや作業ツリーにはまったく触れません(ただし、すべてのモードがそうであるように、頭をにリセットします)。これにより、変更されたすべてのファイルが「コミットされる変更」のままになります。これは、gitステータスに記載されているためです。
--hard
インデックスと作業ツリーをリセットします。作業ツリー内の追跡されたファイルに対する変更は破棄されます。