Git復帰、チェックアウト、リセットの違いは何ですか?


274

私は以前の状態にファイルやプロジェクトを復元するか、ロールバックする方法を学習しようとしています、との違いを理解していないgit revertcheckoutreset。一見同じ目的で3つの異なるコマンドがあるのはなぜですか。

回答:


461

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

git revert

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

git checkout

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

git reset

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

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

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

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

コミットしたが他の誰とも共有しておらず、それを望まない場合は、を使用git resetして履歴を書き直し、コミットしたことがないかのように見せることができます。

これらは、考えられる使用シナリオのほんの一部です。状況によっては便利なコマンドが他にもあり、上記の3つのコマンドには他の用途もあります。


13
したがって、3つのコマンドを使用して一部の作業を元に戻すことができます。つまり、「完全に異なる」わけではありません。同じ概念、異なるコンテキスト。
Bruno Santos

16
@BrunoSantos:ローソク足、鉛パイプ、短剣、ロープはすべて人々を殺害するために使用できますが、それらのいずれも特に類似しているという意味ではありません。
Dan Molding

12
@Dan Mounlding -実際には、多くの例があるgit resetgit checkoutまったく同じことを行うことができますが。それらが「リモートで類似していない」と言うことは、過度の誇張ではなく、リモートでさえ真実ではありません。これらの2つのコマンドは非常に多くの異なることを行うことができ、その一部は完全に重複しています。例:git reset --hardgit checkout -- .まったく同じことを行います。そして、論理的に言えば、git reset --hard <path>git checkout <path>もまったく同じことを行う必要があります- gitのは、しかし、それをやってからあなたを防ぐことができます。これら2つのコマンドを混同することは非常に簡単です。
DanGordon、2016年

5
@DanGordon私はおそらくここで意見の違いがあるだけだと気づきます。とはいえ、少し説明した方がいいと思います。あなたは行うことはできませんgit reset --hard <path>あなたができるようにgit checkout <path>2つのコマンドが何かやるからこそ、完全に異なるが。git resetHEADを別のコミットに移動するようGitに指示します。git checkout一方、GitにHEADで何かをするように要求することはありません。HEADはそのままにして、ファイルをチェックアウトするだけです。はい、同様の効果が得られるような方法で作成できます。しかし、彼らが実際に行うことはまったく異なります。
Dan Molding

46

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

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完全に元の状態に戻ります。


1
直感的な答え..チェックアウトはどうですか
MJ Studio

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

7
私はあなたが「git reset」について間違っていると信じています。「git reset」はHEADを以前のコミットの1つにリセットします。作業ディレクトリはリセットされません。作業ディレクトリは「git checkout [filename]」によって「リセット」されます
luigi7up

11
git reset --softHEADのみをgit reset --hardリセットし、HEADと作業ディレクトリをリセットします。
Ehryk、2014年

git reset --mixed(デフォルト):uncommit + unstage changes
NattyC

21
  • git checkout 作業ツリーを変更し、
  • git reset ポイントしているブランチの参照を変更し、
  • git revert 変更を元に戻すコミットを追加します。

4
git reset はブランチが指すコミットを変更するだけでなく、ファイルをインデックスからアンステージするためにも使用され、作業コピーをgit reset --mixed(デフォルト)で変更できます。

git reset --soft:変更をコミットせず、変更はステージングされたままです(インデックス)。git reset --mixed(デフォルト):変更をコミット解除+ステージング解除、変更は作業ツリーに残ります。git reset --hard:コミット解除+ステージング解除+変更の削除、何も残っていません。
NattyC

6

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

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

あなたはこのリンクを見ることができます- リセット、チェックアウト、元に戻す


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