1

从 devops 最近的工作来看,似乎有“两种方法”可以在 git 中签出分支:使用普通的分支名称,例如dev,或使用前缀为 的分支名称refs/heads/,例如refs/heads/dev

两者有什么区别?

Jenkins 的 Bitbucket webhook 中的某些 HTTP POST 内容提供refs/head了分支的 " " 版本。其他 POST 内容给出了“basename”分支。
例如,使用(我认为是)Jenkins 语法从拉取请求 Bitbucket 事件中获取 POST 内容,$.pullRequest.fromRef.id== /refs/heads/dev...
$.pullRequest.fromRef.displayId==dev

在克隆的存储库中,检出refs/heads/devdev解析为相同的 SHAID,但它们各自stdout的 s 不同:

$ git checkout refs/heads/dev
Note: checking out 'refs/heads/dev'.

You are in 'detached HEAD' state. You can look around, make experimental
changes and commit them, and you can discard any commits you make in this
state without impacting any branches by performing another checkout.

If you want to create a new branch to retain commits you create, you may
do so (now or later) by using -b with the checkout command again. Example:

  git checkout -b <new-branch-name>

HEAD is now at c320fd1... wip
$ git checkout dev
Switched to branch 'dev'
Your branch is up-to-date with 'origin/dev'.
$ git log --oneline -n 1
c320fd1 wip

前者的stdout外观与您查看 SHAID 时的外观相同。

4

1 回答 1

1

根据docs 中的规则,名称被解析为早期的修订 ID 。

当您提供的 ref 通过(仅)添加refs/heads/前缀来解决时,Git 的便利机制就会启动,git checkout它将成为HEAD分支提示的别名,因此所有依赖的便利命令都HEAD将引用和更新分支提示 ref。

因此,当您说git checkout dev,您正在使用 Git 的便利机制并且它为您做便利的事情时,它连接HEAD为符号引用,refs/heads/dev并且git commit'HEAD更新将被重定向到该分支提示。

但是,如果您通过自己采取明确的步骤来绕过便利逻辑,则不会发生这种情况。这真的是唯一的区别。如果你愿意,你可以

git checkout refs/heads/dev 
git symbolic-ref HEAD refs/heads/dev

现在您已经自己完成了 Git 的便捷处理。

于 2021-05-26T17:11:18.657 回答