当本地存储库将默认分支更改为与上游存储库不同的内容时,是否有方法确定上游存储库上的默认分支是什么?
git rev-parse
(推荐)就这样做:
git rev-parse --abbrev-ref refs/remotes/origin/HEAD
这应该打印出远程的
HEAD
分支,对于托管仓库来说应该是默认分支,无论是 origin/main
、origin/master
、origin/develop
、origin/stable
,等等。 (如果远程实际上是另一个工作副本,则远程 HEAD
是签出分支。)
您的本地 Git 存储库会缓存此信息,作为参考
refs/remotes/origin/HEAD
(将 origin
替换为远程名称的任何名称。)通常这会由 git clone
自动设置,但如果您的本地存储库有稍微不寻常的历史记录(例如,如果您的本地存储库在远程存储库之前开始其生命),则该本地引用可能会丢失。在这种情况下,这通常会重新创建它:
git remote set-head origin --auto
这将联系远程,检查其实际的
HEAD
分支是什么,并更新本地 Git 存储库的 refs/remotes/origin/HEAD
引用。
由于这是本地缓存的信息,因此如果远程存储库更改其默认分支,它可能会过时。
git fetch
不会检测到该更改,但git remote set-head origin --auto
将检查远程 HEAD 是什么并更新此本地引用以匹配。因此,在远程存储库中进行任何此类更改后,您可能需要手动运行该命令。
总结:
git rev-parse --abbrev-ref refs/remotes/origin/HEAD
快速给出答案,但失败或错误的可能性很小;
git remote set-head origin --auto &&
git rev-parse --abbrev-ref refs/remotes/origin/HEAD
总是正确的,但速度较慢。
git ls-remote
git ls-remote --symref origin HEAD
输出示例:
ref: refs/heads/main HEAD
bbac5bc097f944b3ad94e723364c5513d27b1910 HEAD
你甚至可以这样做:
git ls-remote --symref origin HEAD |
egrep '^ref: refs/heads/.*\tHEAD$' |
cut -d/ -f3- |
cut $'-d\t' -f1
这只会打印
main
(或 master
,或其他)。
我推荐解决方案1,因为它更简单,而且我不认为这个解决方案比它有任何真正的优势。
如果远程恰好是 GitHub 或 GitHub Enterprise,您还可以使用 GitHub CLI:
gh repo view --json defaultBranchRef --jq .defaultBranchRef.name
这将打印
main
或 master
,或者任何远程默认分支名称。
我也不推荐这个解决方案,因为解决方案 1 和 2 适用于任何 Git 主机(GitHub、GitLab、BitBucket、Gitea 等)。另外,它需要您安装和配置另一个 CLI 工具。
Git 中没有“默认分支”的符号。本地和远程存储库中只有
HEAD
。您经常在本地移动 HEAD
,因此上游 HEAD
和本地 HEAD
之间几乎总是存在差异。