我一直想到git reset
和git checkout
同样,从某种意义上说,两者都将项目带回到特定的提交。svn co
恢复提交。
添加
VonC 和 Charles 解释了两者之间的差异git reset
和git checkout
真的很好。git reset
将所有更改恢复到特定提交,而git checkout
或多或少为分支做准备。
添加 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。
git checkout bar
git reset --hard newbar
git branch -d newbar
答案
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
本身指向另一个分支。
不过,就这些点而言:
不过,这个答案的第一段具有误导性:"
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
,但不会有指向分支引用的箭头。