如何在Git中获取当前分支名称?

3971

如何在Git中获取当前分支的名称?


15
让你的集成开发环境(IDE)显示文件.git/HEAD,可能位于父目录中。 - Tino
124
显示Git中当前分支的命令是:$ git rev-parse --abbrev-ref HEAD - Fantastory
3
可能是重复的问题:如何以编程方式确定当前检出的Git分支 - tripleee
2
启用NetBeans中的“视图->显示版本标签”,然后您所需要做的就是将鼠标悬停在项目(或文件,或收藏夹)文件夹上,即可查看当前分支。 - idclaar
9
可能是在Git中仅显示当前分支的重复问题。 - techraf
显示剩余6条评论
51个回答

5421

110
不错,可惜如果你处于“分离的 HEAD”状态下它就无法运行(只会输出“HEAD”,完全没有用)。 - Carlos Campderrós
49
我猜根据 Git 内部机制,如果你处于“分离 HEAD”状态,则没有跟踪它所属的分支,因为 git branch 显示 *(无分支),这也是无用的... - Carlos Campderrós
83
"git symbolic-ref --short HEAD" 也可用于相同的目的。 - dusktreader
26
git rev-parse --abbrev-ref HEAD 2>/dev/null 这条命令用来获取当前所在的分支名称,在新建的、还没有 HEAD 的仓库中运行不会报错,因为 2>/dev/null 部分可以防止错误信息输出。 - Paradiesstaub
19
git symbolic-ref --short HEAD 看起来更加通用。如果仓库刚初始化,git rev-parse --abbrev-ref HEAD 会返回 HEAD - Alex Fortuna
显示剩余22条评论

4158
git branch

应该显示您存储库的所有本地分支。星标分支是您当前的分支。

只获取您所在分支的名称:

git rev-parse --abbrev-ref HEAD

版本2.22新增了--show-current选项,用于“打印当前分支的名称”。这个组合也适用于在第一次提交之前刚初始化的存储库。
git branch --show-current

2
但这对我在Notepad++和Netbeans上并没有帮助。只有git bash(可能还有Vim),我已经提到了。我正在尝试使用其他不是命令行的IDE和文本编辑器进行工作。 - mike628
2
如果你愿意在Eclipse中工作,有一个名为“eGit”的程序,它有一个GUI,可以告诉你其中所有存储库的当前分支。否则,我不知道...你将取决于你想使用的任何插件的创建者,这些插件与你选择的程序兼容(如果有的话)。 - roberttdev
4
在执行了 git checkout --orphan foo 命令后,使用 git branch 没有显示分支 foo。然而,像其他回答建议的那样,使用 git symbolic-ref HEAD 命令可以起到作用。 - Marcus Junius Brutus
2
git rev-parse --abbrev-ref HEAD 究竟是做什么的?我之前使用的是 git describe --contains --all HEAD,但有时会出错,而我不太确定原因。 - Schneems
1
git branch --show-current 对我来说很有效。 - Olotin Temitope
显示剩余13条评论

591

你还可以使用git symbolic-ref HEAD来显示完整的refspec。

为了在Git v1.8及更高版本中只显示分支名称(感谢Greg指出这一点):

git symbolic-ref --short HEAD

在 Git v1.7+ 中,你也可以这样做:

git rev-parse --abbrev-ref HEAD

如果您在一个分支上,两者应该给出相同的分支名称。如果您在分离头上,答案不同。

注意:

在较早的客户端上,这似乎有效:

git symbolic-ref HEAD | sed -e "s/^refs\/heads\///"

Darien 26. Mar 2014


11
与其他答案一样,当你处于“分离的 HEAD”状态时,这个方法不起作用。 - Carlos Campderrós
66
如果你处于“分离头指针”的状态,那么就不存在当前分支这样的概念。毕竟,你所在的提交可能被零个、一个或多个分支所引用。 - Flimm
2
当空的 Git 存储库中没有 HEAD 时,会出现问题。 - Arne
14
使用git版本2.4.4,当您处于分离的HEAD状态时,git rev-parse --abbrev-ref HEAD显示HEAD - peterhil
1
最佳答案仍然是 git symbolic-ref HEAD | sed -e "s/^refs\/heads\///",因为它会在分离状态下显示类似于 HEAD detached at a63917f 的字符串,而其他答案则显示空白或 HEAD。这很重要。 - Bernard
显示剩余3条评论

323

为了方便自己(但对他人也可能有用),我总结了本主题中提到的大多数(基本命令行)技巧,每种技巧应用于多个用例:HEAD 指向以下内容之一:

  • 本地分支(master
  • 与本地分支同步的远程跟踪分支(origin/master指向与 master 相同提交的分支)
  • 不与任何本地分支同步的远程跟踪分支(origin/feature-foo
  • 标记(v1.2.3
  • 子模块(在子模块目录中运行)
  • 一般的断头状态(不属于上述情况)

结果如下:

  • git branch | sed -n '/\* /s///p'
    • 本地分支:master
    • 远程跟踪分支(已同步):(detached from origin/master)
    • 远程跟踪分支(未同步):(detached from origin/feature-foo)
    • 标签:(detached from v1.2.3)
    • 子模块:(HEAD detached at 285f294)
    • 一般的断头状态:(detached from 285f294)
  • git status | head -1
    • 本地分支:# On branch master
    • 远程跟踪分支(已同步):# HEAD detached at origin/master
    • 远程跟踪分支(未同步):# HEAD detached at origin/feature-foo
    • 标签:# HEAD detached at v1.2.3
    • 子模块:# HEAD detached at 285f294
    • 一般的断头状态:# HEAD detached at 285f294
  • git describe --all
    • 本地分支:heads/master
  • 远程跟踪分支(同步):heads/master(注意:不是remotes/origin/master
  • 远程跟踪分支(不同步):remotes/origin/feature-foo
  • 标签:v1.2.3
  • 子模块:remotes/origin/HEAD
  • 一般分离头状态:v1.0.6-5-g2393761
  • cat .git/HEAD:
    • 本地分支:ref: refs/heads/master
    • 子模块:cat:.git/HEAD:不是目录
    • 所有其他用例:相应提交的SHA值
  • git rev-parse --abbrev-ref HEAD
    • 本地分支:master
    • 所有其他用例:HEAD
  • git symbolic-ref --short HEAD
    • 本地分支:master
    • 所有其他用例:fatal: ref HEAD is not a symbolic ref
  • (FYI,这是使用 git 版本 1.8.3.1 完成的)


    7
    总结一下,似乎没有任何一个工具可以像我自己动手那样做到完美。 - bukzor
    9
    这对我很有帮助:git describe --all --exact-match 2>/dev/null | sed 's=.*/==' 对我来说是最好的解决方案(适用于标签和分支主题的良好命名,并且对于随机分离头无输出)。 - Alex Dupuy
    1
    然而,我刚刚发现当有多个分支引用相同的提交时,例如在git checkout -b foo之后,使用git describe存在严重问题-它会任意选择其中一个(似乎是最近创建的一个)。我将改变我的策略,使用git branch的过滤输出,并仅在结果为“detached head”时使用git describe - Alex Dupuy
    2
    “当前分支”(由checkout foo设置)和“当前提交”是两个不同的概念。 symbolic-ref仅查看活动分支。 describe仅查看“提交”,并从指向它(或附近)的所有分支/标签中启发式选择。 DWIM命令(如branchstatus)在定义了当前分支时使用当前分支,但在所有“分离的HEAD”情况下,所有命令都会进行启发式选择。 - Beni Cherniavsky-Paskin
    1
    你能把 git branch --show-current 的结果添加到这个列表中吗?当本地分支被检出时,它会打印分支的短名称(例如:"master"),否则它将不打印任何内容并返回成功。 - Michael R
    显示剩余2条评论

    259

    从git 2.22版本开始,您只需要使用以下命令:

    git branch --show-current
    

    根据 man page:

    打印当前分支的名称。在分离 HEAD 状态下,不会打印任何内容。


    2
    是的,我在去年三月份在这个页面的评论中提到过:https://stackoverflow.com/questions/6245570/how-to-get-the-current-branch-name-in-git/56501750#comment96922502_6245570。还有在 https://dev59.com/SXM_5IYBdhLWcg3wWRoF#55088865 中也提到了。 - VonC
    10
    至少要提及这在分离头状态下不能使用。我花费了数小时安装 Git 2.22 却什么也没做成...... - David Deprost
    @KarenGoh 当你当前在名为 main 的分支上时,它将显示主要内容。 - Max
    1
    这很奇怪。你确定你至少运行了2.22吗? - Max
    2
    @DavidDeprost 但它是有效的。当处于分离头状态时,您不在分支上。因此,显示空白是非常合理的响应。您期望发生什么? - Shadow
    显示剩余5条评论

    144

    另一个选择:

    git name-rev --name-only HEAD
    

    它也可以通过 echo ${$(git symbolic-ref --quiet HEAD)#refs/heads/} 检索。 - Antoine
    15
    如果主分支和特性分支的HEAD相同(例如在合并期间),该方法无法正常工作。即使在特性分支上执行,它也会返回“master”。请注意,这里的“master”指的是主分支的名称。 - Orest Hera
    1
    git checkout master && git name-rev --name-only HEAD # ac-187。它的运行结果与预期不符。 - Alexander Abashkin
    6
    我是通过 Jenkins 流水线执行这个操作的。因此,目前来看这对我来说似乎是最好的答案。执行 git branch --list 只会显示 * (HEAD detached at 7127db5)。执行 git rev-parse --abbrev-ref HEAD 只会显示 HEAD 等等。 - Mig82
    @AlexanderAbashkin 这个命令在 git 版本 2.17.1 中有效:git checkout master && git name-rev --name-only HEAD,但是 # ac-187 是一个标签名。您能否详细说明一下您使用上述命令的用途?提前感谢您的回答 :) - Chandra Shekhar Paatni
    显示剩余6条评论

    95

    很简单,我用一行代码(bash)搞定了。

    git branch | sed -n '/\* /s///p'
    

    (来源:Limited Atonement)

    在那里,获取远程跟踪分支(如果有的话)的一行命令:

    git rev-parse --symbolic-full-name --abbrev-ref @{u}
    

    11
    斜杠太多了!:) sed -n 's/\* //p' 就可以达到效果。尽管我有点偏执,所以我会用锚定符号改写成 sed -n 's/^\* //p' - Mark Reed

    91

    请在终端中输入以下命令:

    git branch | grep \*
    
    或者
    git branch --show-current 
    

    或者在 Git 2.22 及以上版本中:

      git branch --show
    

    86

    在Linux中,您可以在存储库目录的命令行(控制台)中键入:

    $ git status
    

    你会看到一些文本,其中有类似以下内容的内容:

    ...
    On branch master
    ...
    

    这意味着您当前正在master分支上。如果您此时正在编辑位于同一本地存储库(包含受Git版本控制管理的文件的本地目录)中的任何文件,则您正在编辑此分支中的文件。


    3
    根据您想要做的事情,您可以使用 git status 命令获取输出的第一行,这可以通过在命令后添加 | head -1 来实现,输出结果类似于 # On branch master。请注意,可能还需要考虑版本差异。 - Joshua Pinter
    @JoshPinter:你也可以使用 git status | grep 'On branch',这应该有相同的效果(应该,不意味着如果你的 Git 版本显示不同就会有)。或者使用 git branch | grep '*',它将显示带有星号开头的分支名称。 - Tadeck
    是的,那样也可以,而且可能更灵活。我在一个dev Rails应用程序中只显示分支名称的最终结果是:<tick>git status | head -1<tick>.gsub('# On branch ', '') - Joshua Pinter
    3
    如果要管理的文件很多,运行git status命令可能需要很长时间才能返回结果。 - the Tin Man
    是的,如果你想在网页上打印分支,例如 git status 可能会拖慢整个页面的生成时间。 - Artem Russakovskii

    40
    git symbolic-ref -q --short HEAD
    

    我在需要当前分支名称的脚本中使用它。它将显示对HEAD的当前短符号引用,这将是您的当前分支名称。


    1
    谢谢,非常好用!我也在我的脚本中添加了“-C path_to_folder”。 - Tony
    1
    这是一个不错的解决方案,因为使用“-q”选项时,它会在“分离的HEAD”状态下返回错误代码,但不会将任何内容打印到stderr。 - hallidave
    这是我在一个全新的仓库中没有任何提交时唯一可行的解决方案。 - niryo

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