「git reset」と「git checkout」の違いは何ですか? 質問する

「git reset」と「git checkout」の違いは何ですか? 質問する

私は、 と は、どちらもプロジェクトを特定のコミットに戻すという意味で、常に同じものだと考えてきました。しかし、冗長になるため、まったく同じにはできないと思います。この 2 つの違いは何でしょうか? svn はコミットを元に戻すだけでよいので、少し混乱してgit resetいます。git checkoutsvn co

追加した

git resetVonC と Charles は、 との違いをgit 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、 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 にはインデックス (リポジトリと作業ツリー間の「ステージング領域」) という概念もあるため、 も使用されます。switchgit checkout
git reset


シンクアイ言及コメント欄記事 "リセットの謎を解く「」。

たとえば、異なるコミットを指す ' master' と ' develop' という 2 つのブランチがあり、現在 ' develop' (つまり HEAD がそれを指す) にいるときに を実行するとgit reset master、' develop' 自体は ' ' と同じコミットを指すようになりますmaster

一方、 を実行するとgit checkout master、「develop」は移動せず、HEADそれ自体が移動します。HEADは「 」を指すようになりますmaster

したがって、どちらの場合もHEADcommit を指すように移動していますAが、その方法は非常に異なります。resetはブランチHEADポイントを に移動し、 checkout はHEADそれ自体を別のブランチを指すように移動します。

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

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

ラースH追加コメント欄:

しかし、この回答の最初の段落は誤解を招きます。「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が、ブランチ参照への矢印は表示されません。

おすすめ記事