1. ホーム
  2. git

[解決済み] git reset」と「git checkout」の違いは何ですか?

2022-03-20 09:08:52

質問

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

追加

VonCとCharlesは、以下の違いについて説明しました。 git resetgit 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 は、具体的には インデックスの更新 HEADを移動させます。
  • git checkout は約 作業ツリーの更新 (インデックスまたは指定したツリーへ)。ブランチをチェックアウトした場合のみ、HEADを更新します(そうでない場合は、最終的に 切り離された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 , update , switch ) は、git のコマンドはひとつだけです。 git checkout .
しかし、git にはインデックス (レポと作業ツリーの間にあるステージング・エリア) という概念があるため、次のようなものもあります。 git reset .


シンカイ 記載事項 コメントで の記事をご覧ください。 リセット・デミスティファイド "です。

例えば、2つのブランチがある場合、' master と' develop は異なるコミットを指しており、現在では ' develop '(だからHEADはそれを指している)を実行すると git reset master , ' develop と同じコミットを指すようになります。 master のようになります。

一方、代わりに git checkout master , ' develop は動きません。 HEAD を使用します。 HEAD を指すようになり、' master '.

つまり、どちらのケースでも HEAD を指して、コミット A しかし、その方法は大きく異なります。 reset はブランチを移動させます。 HEAD を指すと、チェックアウトは HEAD は、別のブランチを指すようにします。

そういう点では、ですが。

LarsH が追加されます。 コメント欄 :

この回答の最初の段落は、しかし、誤解を招くものです: " git checkout ... は、ブランチをチェックアウトした場合のみ HEAD を更新します(そうでない場合は、切り離された HEAD で終了します)" 。
そうではありません。 git checkout は、ブランチでないコミットをチェックアウトしても HEAD を更新します (そして、切り離された HEAD ができあがりますが、それでも更新されます)。

git checkout a839e8f updates HEAD to point to commit a839e8f.

デノボ コンカーズ コメントで :

@LarsHさんのおっしゃる通りです。
2つ目の弾丸は、ブランチをチェックアウトした場合のみ HEAD が更新されるという、HEAD が何であるかについての誤解を含んでいます。
HEADは影のようにどこにでも行く。
ブランチ以外の参照(タグなど)をチェックアウトしたり、直接コミットすると、HEADが移動します。Detached head は HEAD から切り離されたことを意味するのではなく、ブランチ ref から切り離されたことを意味します。これは、たとえば git log --pretty=format:"%d" -1 .

  • アタッチド・ヘッド・ステートは、まず (HEAD -> ,
  • が表示されたままです。 (HEAD しかし、ブランチ参照への矢印は表示されません。