master
随着许多项目中 git 的默认分支名称(例如,在 GitHub 中)的重大转变main
,一些假设它作为默认名称的脚本和配置将被破坏。例如,如果您设置了别名以节省键入一些 git 命令的时间:
[alias]
com = checkout master
rbm = rebase master
rbmi = rebase -i master
这同样适用于 shell 脚本 - 是否有任何等效项,git checkout master
但 master 是当前存储库的任何默认分支?
答案1
Git 没有默认分支的概念。存储库可能包含许多独立的开发线(例如,维护和开发分支),其中没有一个比其他任何一个更特殊。分支的重要性以及如何合并它们取决于存储库的所有者。
您认为 GitHub 和其他地方的默认分支是HEAD
指向裸存储库的分支。您可以通过运行以下命令来查看上次更新远程遥控器时的名称:
$ git rev-parse --abbrev-ref origin/HEAD
origin/master
如果您想了解远程的最新值并且愿意发出网络请求来执行此操作,那么您可以这样做:
$ git ls-remote --symref origin | head -n1
ref: refs/heads/master HEAD
请注意,此参考不会自动更新;您必须运行git remote set-head -a origin
才能更新它。
但是,这并没有告诉您用作默认分支的本地分支的名称。例如,上面的命令来自我的 Git 副本,其中默认分支是master
.但是,在我的本地计算机上,远程存储库的默认分支被拉入的分支被称为dev
(这是我首选的默认分支名称)。如果这就是您想知道的,那么这可能就是您想要的命令(假设origin
是您的遥控器):
$ git config -l | ruby -e '
remote = ARGV[0]
head = `git rev-parse --abbrev-ref #{remote}/HEAD`.chomp
a = {}
while line = $stdin.gets
if line =~ /^branch\.(.*)\.remote=(.*)$/
a[$1] ||= [nil, nil]
a[$1][0] = $2
elsif line =~ %r[^branch\.(.*)\.merge=refs/heads/(.*)$]
a[$1] ||= [nil, nil]
a[$1][1] = $2
end
end
puts a.map { |k, (a, b)| ["#{a}/#{b}", k]}.to_h[head]' origin
由于这是 Ruby,如果您想让它成为单行行,您可以用分号代替换行符。如果您更喜欢 Perl,也可以使用 Perl。
答案2
没有专用命令来获取默认分支。然而,通过一些解决方法,你也许能够得到它。如果您使用自己的存储库,则可以始终选择相同的名称。如果您使用其他人,他们将有某种遥控器,然后这个技巧(来自大卫·沃尔什) 有帮助:
LC_ALL=C git remote show origin | sed -n '/HEAD branch:/{s/.*: //;p}'