`checkout -B`与`symbolic-ref`

时间:2017-04-12 16:18:18

标签: git git-checkout

以下命令是否相同?如果没有,有什么区别?

  

git checkout -B a_branch

  

git branch -f a_branch HEAD
  git symbolic-ref HEAD refs/heads/a_branch

另见this related post

1 个答案:

答案 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

“是指”:

  1. 不对索引和工作树做任何事情(成功);
  2. 如果成功(它确实如此),将a_branch重置为当前提交;和
  3. 如果成功(确实如此),请HEAD引用a_branch
  4. 但是,如果我们添加起点,则步骤1可能失败,而步骤2(如果运行)会执行不同的操作。