web-dev-qa-db-ja.com

Git Revert、Checkout、Resetの違いは何ですか?

ファイルとプロジェクトを以前の状態に復元またはロールバックする方法を学習しようとしていますが、git revertcheckout、およびresetの違いを理解していません。どうやら同じ目的のために3つの異なるコマンドがあるのはなぜですか?誰かがいつ他のコマンドを選択する必要がありますか?

234
haziz

これら3つのコマンドの目的はまったく異なります。それらは、リモートでも似ていません。

git revert

このコマンドは、以前のコミットからの変更を取り消す新しいコミットを作成します。このコマンドは、プロジェクトに新しい履歴を追加します(既存の履歴を変更しません)。

git checkout

このコマンドは、リポジトリからコンテンツをチェックアウトし、作業ツリーに配置します。コマンドの起動方法に応じて、他の効果もあります。たとえば、現在作業しているブランチを変更することもできます。このコマンドは、履歴を変更しません。

git reset

このコマンドはもう少し複雑です。実際には、起動方法に応じていくつかの異なる処理を実行します。インデックス(いわゆる「ステージング領域」)を変更します。または、ブランチヘッドが現在指しているコミットを変更します。このコマンドは、既存の履歴を変更する場合があります(ブランチが参照するコミットを変更することにより)。

これらのコマンドを使用する

プロジェクトの履歴のどこかでコミットが行われ、後でコミットが間違っていて、実行すべきではないと判断した場合、git revertがジョブのツールです。不正なコミットによって導入された変更を取り消し、履歴に「取り消し」を記録します。

作業ツリーのファイルを変更したが、変更をコミットしていない場合は、git checkoutを使用して、ファイルのリポジトリからの新しいコピーをチェックアウトできます。

コミットを行ったが、他の人と共有しておらず、それを望まないことに決めた場合、git resetを使用して履歴を書き換えて、そのコミットを行ったことがないように見えるようにすることができます。 。

これらは、可能な使用シナリオのほんの一部です。いくつかの状況で役立つ他のコマンドがあり、上記の3つのコマンドには他の用途もあります。

411
Dan Moulding
  • git revertは、以前のコミットを取り消すために使用されます。 gitでは、以前のコミットを変更または消去することはできません。 (実際にはできますが、問題が発生する可能性があります。)そのため、以前のコミットを編集する代わりに、revertは以前のコミットを元に戻す新しいコミットを導入します。
  • git resetは、まだコミットされていない作業ディレクトリの変更を元に戻すために使用されます。
  • git checkoutは、他のコミットから現在の作業ツリーにファイルをコピーするために使用されます。ファイルは自動的にコミットされません。
28
Jonathan

コミットがあったとしましょう:

C
B
A

git revert Bは、Bの変更を取り消すコミットを作成します。

git revert Aは、Aの変更を取り消すコミットを作成しますが、Bの変更は変更しません。

Bの変更がAの変更に依存している場合、Aの復帰は不可能であることに注意してください。

git reset --soft Aは、コミット履歴とリポジトリを変更します。ステージングディレクトリと作業ディレクトリは、Cの状態のままです。

git reset --mixed Aは、コミット履歴、リポジトリ、およびステージングを変更します。作業ディレクトリは引き続きCの状態になります。

git reset --hard Aは、コミット履歴、リポジトリ、ステージング、作業ディレクトリを変更します。 Aの状態に完全に戻ります。

23
Akavall
  • git checkoutは作業ツリーを変更し、
  • git resetは、あなたがポイントしているブランチを参照するものを変更します。
  • git revertは、変更を取り消すコミットを追加します。
20
dan_waterworth

Reset-コミットレベルでは、リセットはブランチの先端を別のコミットに移動する方法です。これは、現在のブランチからコミットを削除するために使用できます。

元に戻す-元に戻すと、新しいコミットを作成してコミットが元に戻ります。これは、コミット履歴を書き換える機会がないため、変更を元に戻す安全な方法です。これとは対照的に、git resetは既存のコミット履歴を変更します。このため、パブリックブランチの変更を元に戻すにはgit revertを使用し、プライベートブランチの変更を元に戻すためにgit resetを予約する必要があります。

このリンクを見ることができます- リセット、チェックアウト、復帰

6

ツリーを壊したがコードをコミットしなかった場合は、git resetを使用できます。また、1つのファイルを復元したい場合は、git checkoutを使用できます。

ツリーを壊してコードをコミットした場合、git revert HEADを使用できます。

http://book.git-scm.com/4_undoing_in_git_-_reset,_checkout_and_revert.html

5
LostMohican