「Git Reset」と「Git Checkout」の違いは何ですか?
-
30-09-2019 - |
質問
私はいつも考えてきました git reset
と git checkout
同じように、両方がプロジェクトを特定のコミットに戻すという意味で。しかし、それは冗長であるため、それらはまったく同じではないと感じています。 2つの実際の違いは何ですか? SVNだけが持っているので、私は少し混乱しています svn co
コミットを元に戻す。
追加した
VoncとCharlesはの違いを説明しました git reset
と git checkout
本当によく。私の現在の理解はそれです git reset
すべての変更を特定のコミットに戻しますが、 git checkout
多かれ少なかれ支店の準備ができます。次の2つの図は、この理解に至るまで非常に役立つことがわかりました。
追加3
から http://think-like-a-git.net/sections/rebase-from-the-ground-up/using-git-cherry-pick-to-simulate-git-rebase.html, 、チェックアウトとリセットは、リベースをエミュレートできます。
git checkout bar
git reset --hard newbar
git branch -d newbar
解決
git reset
特にについてです インデックスの更新, 、頭を動かす。git checkout
についてです 作業ツリーの更新 (インデックスまたは指定されたツリーに)。ブランチをチェックアウトした場合にのみ、頭を更新します(そうでない場合は、 戸建ヘッド).
(実際、GIT 2.23 Q3 2019では、これはgit restore
, 、 必ずしもgit checkout
)
比較すると、SVNにはインデックスがないため、作業ツリーのみがあります。 svn checkout
特定のリビジョンを別のディレクトリにコピーします。
より近い相当 git checkout
します:
svn update
(同じブランチにいる場合、同じSVN URLを意味します)svn switch
(たとえば同じブランチをチェックアウトする場合、しかし別のSVNリポジトリから)
これら3つの作業ツリーの変更(svn checkout
, update
, switch
)gitには1つのコマンドのみがあります。 git checkout
.
しかし、Gitにはインデックスの概念もあるため(リポジトリと作業ツリーの間の「ステージング領域」) git reset
.
シンアイ 言及 コメントで 記事 "リセットデミスティファイ ".
たとえば、2つのブランチがある場合、
master
' と 'develop
「さまざまなコミットを指していて、私たちは現在オンになっています」develop
'(だから頭がそれを指している)そして私たちは走りますgit reset master
, 'develop
「それ自体が同じコミットを指します」master
'します。一方、代わりに実行する場合
git checkout master
, 'develop
「動かない、HEAD
それ自体がそうするでしょう。HEAD
今指さしますmaster
'.したがって、どちらの場合も動いています
HEAD
コミットすることを指すA
, 、しかし、私たちがそうする方法は非常に異なっています。reset
枝を移動しますHEAD
ポイント、チェックアウトの動きHEAD
それ自体が別のブランチを指す。
ただし、これらの点については:
しかし、この答えの最初の段落は、誤解を招くことです:」
git checkout
...ブランチをチェックアウトした場合にのみヘッドを更新します(そうでない場合は、ヘッドが切り離されたものになります)」。
違います:git checkout
ブランチではないコミットをチェックアウトしても、頭を更新します(そして、はい、あなたは孤立した頭になりますが、それでも更新されました)。git checkout a839e8f updates HEAD to point to commit a839e8f.
@larshは正しいです。
2番目の弾丸には、頭がどのようなものにあるかについての誤解があります。ブランチをチェックアウトした場合にのみ、頭が更新されます。
頭はあなたがどこにいても、影のように行きます。
いくつかの非ブランチref(タグなど)、または直接コミットをチェックすると、ヘッドが移動します。戸建ヘッドは、頭から切り離されたという意味ではなく、頭が枝Refから切り離されていることを意味します。git log --pretty=format:"%d" -1
.
- 添付のヘッド状態は始まります
(HEAD ->
,- 分離したものはまだ表示されます
(HEAD
, 、しかし、ブランチrefへの矢印はありません。
他のヒント
最も単純な形で、 reset
作業ツリーに触れずにインデックスをリセットしますが、 checkout
インデックスに触れずに作業ツリーを変更します。
一致するインデックスをリセットします HEAD
, 、ワーキングツリーは放っておきます:
git reset
概念的には、これは作業ツリーのインデックスをチェックアウトします。実際に何でもするためにそれを取得するためにあなたは使用しなければならないでしょう -f
局所的な変更を上書きするように強制します。これは、「引数なし」フォームが破壊的でないことを確認するための安全機能です。
git checkout
パラメーターの追加を開始すると、重複があることは事実です。
checkout
通常、ブランチ、タグ、またはコミットで使用されます。この場合、リセットされます HEAD
指定されたコミットのインデックスと、作業ツリーへのインデックスのチェックアウトを実行します。
また、あなたが供給した場合 --hard
に reset
質問できるよ reset
作業ツリーを上書きするだけでなく、インデックスをリセットします。
あなたが現在ブランチをチェックアウトしている場合、間に重要な違いがあります reset
と checkout
代替ブランチまたはコミットを提供するとき。 reset
現在のブランチを変更して、選択したコミットを指すのに対し、 checkout
現在のブランチをそのままにしておきますが、代わりに供給された支店をチェックアウトするか、コミットします。
他の形式 reset
と commit
パスの供給を含む。
にパスを供給する場合 reset
供給できません --hard
と reset
供給されたコミットのバージョンに提供されたパスのインデックスバージョンのみを変更します(または HEAD
コミットを指定しない場合)。
にパスを供給する場合 checkout
, 、 お気に入り reset
供給されたコミットと一致するように、付属のパスのインデックスバージョンを更新します(または HEAD
)しかし、それは常に作業ツリーに付属のパスのインデックスバージョンをチェックアウトします。
変化を取り戻すときの1つの単純なユースケース:
1.変更されたファイルのステージングを元に戻す場合は、リセットを使用します。
2.変更を停止していないファイルに廃棄する場合は、チェックアウトを使用します。
アトラシアン 素晴らしい説明をしてください gitリセット, gitチェックアウト など、 gitの戻り. 。この記事では、これらのコマンドのさまざまな用途が、ファイル、段階的なスナップショット、コミットでの異なる使用について説明しています。
https://www.atlassian.com/git/tutorials/resetting-checking-and-reverting
一言で言えば、重要な違いはそれです reset
現在のブランチ参照を移動します, 、 その間 checkout
そうではありません(頭を動かします)。
プロの本が説明しているように リセットデミスティファイ,
最初のもの
reset
そうです ヘッドポイントを移動します. 。これは同じではありません 頭を変える (これが何ですかcheckout
行う);reset
枝を移動します その頭は指しています。これは、ヘッドがに設定されている場合を意味しますmaster
ブランチ(つまり、現在オンになっていますmaster
ブランチ)、ランニングgit reset 9e5e6a4
作ることから始めますmaster
指し示す9e5e6a4
. 。 [強調を追加
aのVONCの答えも参照してください 非常に役立つテキストと図の抜粋 同じ記事から、ここでは複製しません。
もちろん、どのような影響について詳細があります checkout
と reset
どのパラメーターが使用されるかに応じて、インデックスと作業ツリーを使用することができます。 2つのコマンドの間には多くの類似点と相違点があります。しかし、私が見るように、最も重要な違いは、彼らが現在の枝の先端を動かすかどうかです。
2つのコマンド(リセットとチェックアウト)は完全に異なります。
checkout X
ではありません reset --hard X
xがブランチ名の場合、checkout X
現在のブランチは変更されます reset --hard X
しない。