質問

私はいつも考えてきました git resetgit checkout 同じように、両方がプロジェクトを特定のコミットに戻すという意味で。しかし、それは冗長であるため、それらはまったく同じではないと感じています。 2つの実際の違いは何ですか? SVNだけが持っているので、私は少し混乱しています svn co コミットを元に戻す。

追加した

VoncとCharlesはの違いを説明しました git resetgit checkout 本当によく。私の現在の理解はそれです git reset すべての変更を特定のコミットに戻しますが、 git checkout 多かれ少なかれ支店の準備ができます。次の2つの図は、この理解に至るまで非常に役立つことがわかりました。

http://a.imageshack.us/img651/1559/86421927.png http://a.imageshack.us/img801/1986/resetr.png

追加3

から http://think-like-a-git.net/sections/rebase-from-the-ground-up/using-git-cherry-pick-to-simulate-git-rebase.html, 、チェックアウトとリセットは、リベースをエミュレートできます。

enter image description here

git checkout bar 
git reset --hard newbar 
git branch -d newbar 

enter image description here

役に立ちましたか?

解決

  • 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 それ自体が別のブランチを指す。

http://git-scm.com/images/reset/reset-checkout.png

ただし、これらの点については:

ラーシュ 追加します コメントで:

しかし、この答えの最初の段落は、誤解を招くことです:」git checkout ...ブランチをチェックアウトした場合にのみヘッドを更新します(そうでない場合は、ヘッドが切り離されたものになります)」。
違います: git checkout ブランチではないコミットをチェックアウトしても、頭を更新します(そして、はい、あなたは孤立した頭になりますが、それでも更新されました)。

git checkout a839e8f updates HEAD to point to commit a839e8f.

de novo 同意します コメントで:

@larshは正しいです。
2番目の弾丸には、頭がどのようなものにあるかについての誤解があります。ブランチをチェックアウトした場合にのみ、頭が更新されます。
頭はあなたがどこにいても、影のように行きます。
いくつかの非ブランチref(タグなど)、または直接コミットをチェックすると、ヘッドが移動します。戸建ヘッドは、頭から切り離されたという意味ではなく、頭が枝Refから切り離されていることを意味します。 git log --pretty=format:"%d" -1.

  • 添付のヘッド状態は始まります (HEAD ->,
  • 分離したものはまだ表示されます (HEAD, 、しかし、ブランチrefへの矢印はありません。

他のヒント

最も単純な形で、 reset 作業ツリーに触れずにインデックスをリセットしますが、 checkout インデックスに触れずに作業ツリーを変更します。

一致するインデックスをリセットします HEAD, 、ワーキングツリーは放っておきます:

git reset

概念的には、これは作業ツリーのインデックスをチェックアウトします。実際に何でもするためにそれを取得するためにあなたは使用しなければならないでしょう -f 局所的な変更を上書きするように強制します。これは、「引数なし」フォームが破壊的でないことを確認するための安全機能です。

git checkout

パラメーターの追加を開始すると、重複があることは事実です。

checkout 通常、ブランチ、タグ、またはコミットで使用されます。この場合、リセットされます HEAD 指定されたコミットのインデックスと、作業ツリーへのインデックスのチェックアウトを実行します。

また、あなたが供給した場合 --hardreset 質問できるよ reset 作業ツリーを上書きするだけでなく、インデックスをリセットします。

あなたが現在ブランチをチェックアウトしている場合、間に重要な違いがあります resetcheckout 代替ブランチまたはコミットを提供するとき。 reset 現在のブランチを変更して、選択したコミットを指すのに対し、 checkout 現在のブランチをそのままにしておきますが、代わりに供給された支店をチェックアウトするか、コミットします。

他の形式 resetcommit パスの供給を含む。

にパスを供給する場合 reset 供給できません --hardreset 供給されたコミットのバージョンに提供されたパスのインデックスバージョンのみを変更します(または 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の答えも参照してください 非常に役立つテキストと図の抜粋 同じ記事から、ここでは複製しません。

もちろん、どのような影響について詳細があります checkoutreset どのパラメーターが使用されるかに応じて、インデックスと作業ツリーを使用することができます。 2つのコマンドの間には多くの類似点と相違点があります。しかし、私が見るように、最も重要な違いは、彼らが現在の枝の先端を動かすかどうかです。

2つのコマンド(リセットとチェックアウト)は完全に異なります。

checkout X ではありません reset --hard X

xがブランチ名の場合、checkout X 現在のブランチは変更されます reset --hard X しない。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top