私は、 と は、どちらもプロジェクトを特定のコミットに戻すという意味で、常に同じものだと考えてきました。しかし、冗長になるため、まったく同じにはできないと思います。この 2 つの違いは何でしょうか? svn はコミットを元に戻すだけでよいので、少し混乱してgit reset
います。git checkout
svn co
追加した
git reset
VonC と Charles は、 との違いを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、 checkout および reset はリベースをエミュレートできます。
git checkout bar
git reset --hard newbar
git branch -d newbar
ベストアンサー1
git reset
具体的には、インデックスを更新し、HEAD を移動することです。git checkout
は、作業ツリー(インデックスまたは指定されたツリー)を更新することです。ブランチをチェックアウトした場合にのみHEADを更新します(そうでない場合は、切り離されたヘッド)。
(実際、Git 2.23 Q3 2019では、これはgit restore
、 必ずしもgit checkout
)
比較すると、svnにはインデックスがなく、作業ツリーのみなので、svn checkout
は、指定されたリビジョンを別のディレクトリにコピーします。
のより近い同等のものはgit checkout
次のようになります。
svn update
(同じブランチ、つまり同じ SVN URL にいる場合)svn switch
(たとえば、同じブランチを別の SVN リポジトリ URL からチェックアウトする場合)
これら 3 つの作業ツリーの変更 ( svn checkout
、、) には、git では という 1 つのコマンドだけが使用されますupdate
。ただし、git にはインデックス (リポジトリと作業ツリー間の「ステージング領域」) という概念もあるため、 も使用されます。switch
git checkout
git reset
たとえば、異なるコミットを指す '
master
' と 'develop
' という 2 つのブランチがあり、現在 'develop
' (つまり HEAD がそれを指す) にいるときに を実行するとgit reset master
、'develop
' 自体は ' ' と同じコミットを指すようになりますmaster
。一方、 を実行すると
git checkout master
、「develop
」は移動せず、HEAD
それ自体が移動します。HEAD
は「 」を指すようになりますmaster
。したがって、どちらの場合も
HEAD
commit を指すように移動していますA
が、その方法は非常に異なります。reset
はブランチHEAD
ポイントを に移動し、 checkout はHEAD
それ自体を別のブランチを指すように移動します。
ただし、それらの点については、
しかし、この回答の最初の段落は誤解を招きます。「
git checkout
... は、ブランチをチェックアウトした場合にのみ HEAD を更新します (そうでない場合は、分離された HEAD になります)」。これは
正しくありません。git checkout
ブランチではないコミットをチェックアウトした場合でも HEAD が更新されます (そして、確かに分離された HEAD になりますが、それでも更新されています)。git checkout a839e8f updates HEAD to point to commit a839e8f.
@LarsH は正しいです。2
番目の箇条書きには、HEAD がブランチをチェックアウトした場合にのみ HEAD を更新するという誤解があります。HEAD
は、影のように、どこにでも移動します。
ブランチ以外の参照 (タグなど) をチェックアウトしたり、直接コミットしたりすると、HEAD が移動します。ヘッドが切り離されたということは、HEAD から切り離されたということではなく、たとえば から確認できるブランチ参照からヘッドが切り離されたことを意味しますgit log --pretty=format:"%d" -1
。
- 添付されたヘッド状態は
(HEAD ->
、- detached は引き続き表示されます
(HEAD
が、ブランチ参照への矢印は表示されません。