git - `checkout -B` 与 `symbolic-ref`

标签 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 .

最佳答案

是的,它们非常接近,以至于它们可能是相同的。

到这里就可以结束了,剩下的就是因为上面是一个特例

如果你稍微改变其中一个,它们就会变得不那么亲密。考虑一下您可以将其用作:

git checkout -B <em>name</em> <em>commit-specifier</em>

以及:

git checkout -B <em>name</em>

这实际上意味着:

git checkout -B <em>name</em> HEAD

the documentation说,-b-B标志是某些替代命令序列的“事务等效项”。如果这些命令在某个地方会(或确实)失败,-b-B行动被抑制。和git checkout <em>commit-specifier</em>当您有未提交的更改将被 checkout 覆盖时,实际上可能会失败。

但是,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 .

但是,如果我们添加起点,步骤 1 可能失败,而步骤 2(如果运行)会执行不同的操作。

关于git - `checkout -B` 与 `symbolic-ref`,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43374766/

相关文章:

git - Github Action通过时如何 merge 到 protected 分支?

git-commit - GIT 暂存并仅提交具有特定文件结尾的文件

git - 使用 git 追加分支提交

Git 通过单个命令重置和 checkout

git - 意外 checkout 后取回更改?

git - 克隆旧版本的 github repo

git - 推送到远程后,如何用新提交覆盖或替换提交?

git - 你如何阻止用户提交到 git 中的子模块?

Git branch checkout 说虽然我的工作目录是干净的,但文件将被覆盖

git - 在 Git 中以只读目的 check out 早期标记的最简洁方法