我一直想到git resetgit checkout同样,从某种意义上说,两者都将项目带回到特定的提交。svn co恢复提交。

添加

VonC 和 Charles 解释了两者之间的差异git resetgit checkout真的很好。git reset将所有更改恢复到特定提交,而git checkout或多或少为分支做准备。

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可以模拟rebase。

enter image description here

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

enter image description here

答案

  • git reset具体是关于updating the index,移动头部。
  • git checkout是关于updating the working tree (到索引或指定的树)。分离头)。
    (实际上,对于 Git 2.23 Q3 2019,这将是git restore, 不必要git checkout

相比之下,由于 svn 没有索引,只有工作树,svn checkout将在单独的目录中复制给定的修订版。
更接近的等价于git checkout会:

  • svn update(如果你们在同一个分支,意思是同一个SVN URL)
  • svn switch(例如,如果您从另一个 SVN 存储库 URL 签出同一分支)

所有这三个工作树修改(svn checkout,update,switch)在 git 中只有一个命令:git checkout
但由于 git 也有索引的概念(存储库和工作树之间的"暂存区域"),所以你也有git reset


思眼提及在评论中文章"重置揭秘"。

例如,如果我们有两个分支,’master’ 和 ‘develop’ 指向不同的提交,我们目前正在进行 ‘develop’ (所以 HEAD 指向它)然后我们运行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

不过,就这些点而言:

拉尔斯H添加在评论中:

不过,这个答案的第一段具有误导性:"git checkout…仅当您签出分支时才会更新 HEAD(如果没有,您最终会得到一个分离的 HEAD)"。
不对:git checkout即使您签出不是分支的提交(是的,您最终会得到一个分离的 HEAD,但它仍然会更新),也会更新 HEAD。

git checkout a839e8f updates HEAD to point to commit a839e8f.

从头同意在评论中:

@LarsH 是正确的。
第二个项目符号对 HEAD 所在的内容存在误解,只有在您签出分支时才会更新 HEAD。
无论你在哪里,HEAD 都会像影子一样。
检查一些非分支引用(例如,标签),或直接提交,将移动 HEAD。git log --pretty=format:"%d" -1

  • 附加的头状态将从(HEAD ->,
  • 分离后仍会显示(HEAD,但不会有指向分支引用的箭头。

来自: stackoverflow.com