如何从命令行获取主 git 分支名称?

6
如何从命令行/终端获取主分支名称?
我知道默认情况下主分支被称为master,但是人们可以将其重命名为任何他们想要的名称。
PS-获取本地和远程主分支名称会很不错。
编辑:其他人可能称之为默认分支稳定分支,它是您(应该)将所有内容(稳定/工作中)合并到其中的分支。

2
我认为“主分支”这种东西并不存在,因为对于Git来说,所有的分支都只是指向修订版本的指针,它们可以被任何名称所称呼。 - eftshift0
1
eftshift0是正确的。“主分支”这个概念不存在 - Chris
4个回答

7

我对git没有深入的了解,但在git中通常会有{remote}/HEAD,例如origin/HEAD。以下是来自git remote的手册页面摘录:

 set-head

    Sets or deletes the default branch (i.e. the target of the
    symbolic-ref refs/remotes/<name>/HEAD) for the named remote.
    Having a default branch for a remote is not required, but allows
    the name of the remote to be specified in lieu of a specific
    branch. For example, if the default branch for origin is set to
    master, then origin may be specified wherever you would normally
    specify origin/master.

我理解,{remote}/HEAD{remote} 的主/默认分支。可以使用以下命令获取分支名称(有人知道更好的/管道命令吗?):

git branch -r | grep -Po 'HEAD -> \K.*$'
origin/master

当一个人想要获取本地主/默认分支时,通常没有 HEAD 分支,但通常有一个唯一的分支跟踪 {remote}/HEAD,我们可以使用以下命令获取其名称(同样,肯定有更好的命令):

git branch -vv | grep -Po "^[\s\*]*\K[^\s]*(?=.*$(git branch -rl '*/HEAD' | grep -o '[^ ]\+$'))"
master

当然,如果还没有设置,则需要使用set-head命令,以便在git remote -r的输出中拥有一个“HEAD/master/main分支”。因此,在使用上述命令之前,我们需要运行以下命令一次(感谢@pixelbrackets指出这一点)。
git remote set-head origin -a

更新:

最近,我想获取一些更多的信息(从这里得到一些命令):

# Get currently checked out local branch name
git rev-parse --abbrev-ref HEAD
# Output: branch

# Get remote branch name that is tracked by currently checked out local branch
git for-each-ref --format='%(upstream:short)' "$(git symbolic-ref -q HEAD)"
# Output: origin/branch

# Get local main branch name
git branch -vv | grep -Po \
  "^[\s\*]*\K[^\s]*(?=.*$(git branch -rl '*/HEAD' | grep -o '[^ ]\+$'))"
# Output: master

# Get remote branch name that is tracked by local main branch (AKA the remote HEAD branch)
git branch -r | grep -Po 'HEAD -> \K.*$'
# Output: origin/master

1
这个答案只适用于源代码库显示了 HEAD。但这并不一定是情况。要设置它,请运行 git remote set-head origin -a(来源 stackoverflow.com/a/52062124/3894752)。然后给出的命令 git branch -r | grep -Po "HEAD -> \K.*$" 就可以正常工作了。 - pixelbrackets

5

如果你假设主分支要么被称为master要么被称为main,这是我在本地代码仓库快速检测主分支名称的方法:

git_main_branch () {
    git branch | cut -c 3- | grep -E '^master$|^main$'
}

然后,其他需要知道主分支名称的命令可以使用它。例如,我有一个代表“git检出主分支”的gc-m命令:

alias gc='git checkout '
alias gc-m='gc $(git_main_branch)'

3
我宁愿不做任何假设。 - tukusejssirs

3

你也可以使用类似这样的方法:

alias gc-m='git checkout `git branch -rl "*/HEAD" | rev | cut -d/ -f1 | rev`'

谢谢,@LuisDavim!(1)我可以将您的命令缩短为alias gc-m='git checkout "$(git branch -rl '*/HEAD' | grep -o '[^/]\+$')"' - tukusejssirs
我目前使用 git checkout "$(git branch -vv | grep -Po "^[\s\*]*\K[^\s]*(?=.*$(git branch -r | grep -Po 'HEAD -> \K.*$').*)")" 来达到同样的目的(当然,它可以被缩短和优化),但是你的命令和我的命令之间有一个很大的区别:首先我获取远程主分支(例如 origin/master),然后检查哪个本地分支正在跟踪该远程分支。虽然通常情况下不会出现这种情况,但用户可能会更改本地分支名称(或设置不同的分支来跟踪远程主分支),那么你的命令就无法工作了。 - tukusejssirs
我尝试使用你的命令进行更新(由我缩短),但是它比原来多了一个字符:git checkout "$(git branch -vv | grep -Po "^[\s\*]*\K[^\s]+(?=.*$(git branch -rl '*/HEAD' | grep -o '[^ ]\+$'))")" - tukusejssirs

2
你可能需要使用这个命令 git branch -r-r 用于只列出远程分支,如果要列出本地和远程的分支,请使用 -a。 通常主分支指向 origin/HEAD,类似于这样 origin/HEAD -> origin/master。"最初的回答"

我认为这个答案向我展示了一种处理这个问题的“方法”。它是HEAD引用,我相信在一个仓库中只有一个。我错了吗? - tukusejssirs
我错了:有多少分支就有多少HEADs。(参见https://dev59.com/h4Pba4cB1Zd3GeqPwb1J) - tukusejssirs
如果 git branch -rv 没有列出 origin 上的 HEAD,则可以使用 git remote set-head origin -a 进行设置(来源 https://dev59.com/iWvXa4cB1Zd3GeqPImf1#52062124)。 - pixelbrackets

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接