以下命令是否相同?如果没有,有什么区别?
git checkout -B a_branch
和
git branch -f a_branch HEAD
git symbolic-ref HEAD refs/heads/a_branch
答案 0 :(得分:2)
是的,它们非常接近,以至于它们可能完全相同。
如果你稍微改变其中一个,它们就变得不那么近了。请考虑您可以将其用作:
git checkout -B name commit-specifier
以及:
git checkout -B name
实际上意味着:
git checkout -B name HEAD
正如the documentation所述,-b
和-B
标志是某些替代命令序列的“事务等效”。如果这些命令在整个过程中某处(或确实)失败,则-b
或-B
操作被抑制。当您有未提交的更改时,git checkout commit-specifier
实际上可能会失败,而这些更改将被结帐覆盖。
但是,git checkout HEAD
应该永远不会失败。鉴于它实际上不会失败,-B
操作的事务性质变得不重要。所以现在我们看一下文档说的这是事务等价的:
$ git branch -f <branch> [<start point>] $ git checkout <branch>
我们知道起点是HEAD
,所以:
git branch -f a_branch HEAD
是正确的:这与第一个命令匹配。并且,我们知道git checkout <the commit we are already on>
本质上是一个无操作(不会更改索引和工作树),git checkout a_branch
最终会这样做:
git symbolic-ref HEAD refs/heads/a_branch
作为最后的操作,所以:
git checkout -B a_branch
“是指”:
a_branch
重置为当前提交;和HEAD
引用a_branch
。但是,如果我们添加起点,则步骤1可能失败,而步骤2(如果运行)会执行不同的操作。