回答:
これらの3つのコマンドには、まったく異なる目的があります。それらはリモートで類似していません。
git revert
このコマンドは、以前のコミットからの変更を元に戻す新しいコミットを作成します。このコマンドは、プロジェクトに新しい履歴を追加します(既存の履歴は変更されません)。
git checkout
このコマンドは、リポジトリからコンテンツをチェックアウトし、作業ツリーに配置します。コマンドの呼び出し方法によっては、他の効果が生じることもあります。たとえば、現在作業しているブランチを変更することもできます。このコマンドは履歴を変更しません。
git reset
このコマンドはもう少し複雑です。それは実際にそれがどのように呼び出されるかに応じていくつかの異なることをします。インデックス(いわゆる「ステージング領域」)を変更します。または、ブランチヘッドが現在指しているコミットを変更します。このコマンドは、(ブランチが参照するコミットを変更することにより)既存の履歴を変更する場合があります。
コミットがプロジェクトの履歴のどこかに作成されていて、後でコミットが間違っていて実行されるべきではないと判断した場合、それgit revert
はジョブのツールです。不正なコミットによって導入された変更を取り消し、履歴に「取り消し」を記録します。
作業ツリーでファイルを変更したが、変更をコミットしていない場合は、を使用git checkout
して、ファイルのリポジトリからのコピーをチェックアウトできます。
コミットしたが他の誰とも共有しておらず、それを望まない場合は、を使用git reset
して履歴を書き直し、コミットしたことがないかのように見せることができます。
これらは、考えられる使用シナリオのほんの一部です。状況によっては便利なコマンドが他にもあり、上記の3つのコマンドには他の用途もあります。
git reset
とgit checkout
まったく同じことを行うことができますが。それらが「リモートで類似していない」と言うことは、過度の誇張ではなく、リモートでさえ真実ではありません。これらの2つのコマンドは非常に多くの異なることを行うことができ、その一部は完全に重複しています。例:git reset --hard
とgit checkout -- .
まったく同じことを行います。そして、論理的に言えば、git reset --hard <path>
とgit checkout <path>
もまったく同じことを行う必要があります- gitのは、しかし、それをやってからあなたを防ぐことができます。これら2つのコマンドを混同することは非常に簡単です。
git reset --hard <path>
あなたができるようにgit checkout <path>
2つのコマンドが何かやるからこそ、完全に異なるが。git reset
HEADを別のコミットに移動するようGitに指示します。git checkout
一方、GitにHEADで何かをするように要求することはありません。HEADはそのままにして、ファイルをチェックアウトするだけです。はい、同様の効果が得られるような方法で作成できます。しかし、彼らが実際に行うことはまったく異なります。
あなたがコミットしたとしましょう:
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
完全に元の状態に戻ります。
git revert
以前のコミットを元に戻すために使用されます。gitでは、以前のコミットを変更または消去することはできません。(実際には可能ですが、問題が発生する可能性があります。)したがって、以前のコミットを編集する代わりに、元に戻すと、以前のコミットを元に戻す新しいコミットが導入されます。git reset
まだコミットされていない作業ディレクトリの変更を元に戻すために使用されます。git checkout
他のコミットから現在の作業ツリーにファイルをコピーするために使用されます。ファイルは自動的にコミットされません。git reset --soft
HEADのみをgit reset --hard
リセットし、HEADと作業ディレクトリをリセットします。
git checkout
作業ツリーを変更し、git reset
ポイントしているブランチの参照を変更し、git revert
変更を元に戻すコミットを追加します。git reset
はブランチが指すコミットを変更するだけでなく、ファイルをインデックスからアンステージするためにも使用され、作業コピーをgit reset --mixed
(デフォルト)で変更できます。
リセット- コミットレベルでは、リセットはブランチの先端を別のコミットに移動する方法です。これは、現在のブランチからコミットを削除するために使用できます。
元に戻す-元に戻すと 、新しいコミットが作成されてコミットが取り消されます。コミット履歴を書き換える可能性がないため、これは変更を元に戻す安全な方法です。これを、既存のコミット履歴を変更するgit resetと比較してください。このため、パブリックブランチでの変更を元に戻すにはgit revertを使用し、プライベートブランチでの変更を元に戻すにはgit resetを予約する必要があります。
あなたはこのリンクを見ることができます- リセット、チェックアウト、元に戻す
ツリーを壊したが、コードをコミットしなかった場合は、を使用できますgit reset
。1つのファイルだけを復元したい場合は、を使用できますgit checkout
。
ツリーを壊してコードをコミットした場合は、を使用できますgit revert HEAD
。
http://book.git-scm.com/4_undoing_in_git_-_reset,_checkout_and_revert.html