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


我来自Subversion背景,当我有一个分支时,我知道我正在处理的是“这些工作文件指向这个分支”。

但是对于Git,我不确定我何时在NetBeans或Notepad ++中编辑文件,无论它是与主服务器还是其他分支相关联。

没问题 git 在bash中,它告诉我我在做什么。


1718
2018-06-05 20:13


起源


让您的IDE显示该文件 .git/HEAD,可能在父目录中 - Tino
stackoverflow.com/questions/1417957/... $ git rev-parse --abbrev-ref HEAD - fantastory
可能重复 如何以编程方式确定当前签出的Git分支 - tripleee
使用NetBeans中的View - > Show versioning Labels,您只需将鼠标悬停在Project(或File或Favorite)文件夹上即可查看当前分支。 - idclaar
可能重复 只显示Git中的当前分支 - techraf


答案:


git branch

应该显示您的回购的所有本地分支。已加星标的分支是您当前的分支。


1298
2018-06-05 20:17



如果您愿意在Eclipse中工作,那么有一个名为“eGit”的程序,它有一个GUI,可以告诉您当前所有repos的分支。否则,我不知道..你会受到你想要使用的任何插件的创建者的支配,这与你选择的程序兼容(如果有的话)。 - roberttdev
git branch | grep \* 仅返回当前分支(但仍然在其前面有一个星) - fboes
git branch | grep \* | cut -d ' ' -f2 在明星之后拆分空间,仅返回名称。根据@fboes的评论 - jgraup
git branch | grep \* | cut -d ' ' -f2-  - 我建议小改变@ jgraup的评论(替换 -f2 同 -f2-)在第一空间之后得到所有东西,因为在这种情况下 * (HEAD detached at ff3de3c) 你得到 (HEAD 只要 - boobiq
BTW: git rev-parse --abbrev-ref HEAD (如下所述)没有任何进一步的工作,并返回当前的分支名称 sed 要么 grep - fboes


git rev-parse --abbrev-ref HEAD --

那将显示当前分支。

参考:


3643
2017-08-27 12:33



@ChrisNelson,因为它只显示当前分支,而不是所有分支的长列表。 - avakar
好的,遗憾的是,如果你处于“超级头部”状态(它只输出'HEAD',这完全没用),它就不起作用。 - Carlos Campderrós
我想通过git内部,如果你处于'独立的HEAD'状态,就不会跟踪它所属的分支,因为 git branch 节目 * (no branch),这也没用...... - Carlos Campderrós
“git symbolic-ref --short HEAD”也适用于同一目的 - dusktreader
git rev-parse --abbrev-ref HEAD 2>/dev/null  如果您刚创建了一个尚未使用HEAD的新存储库,/ dev / null部分会阻止您看到错误。 - Paradiesstaub


你也有 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. 2014年3月


399
2017-08-08 15:55



与所有其他答案一样,当您处于“分离的HEAD”状态时,这不起作用 - Carlos Campderrós
@CarlosCampderrós:如果你处于分离的HEAD状态,那么就没有当前的分支。毕竟,您所在的提交可以通过零,一个或多个分支来访问。 - Flimm
当没有HEAD时,这会在空的git存储库中产生问题 - Arne
使用git版本2.4.4 git rev-parse --abbrev-ref HEAD 节目 HEAD 当你在独立的头上。 - peterhil
最好的答案仍然是 git symbolic-ref HEAD | sed -e "s/^refs\/heads\///"  因为它会显示一个字符串 HEAD detached at a63917f 当处于分离状态时,与其他没有显示任何内容或HEAD的答案不同。这个很重要。 - Alkaline


为了我自己的参考(但它可能对其他人有用)我概述了这个线程中提到的大多数(基本命令行)技术,每个技术都应用于几个用例:HEAD是(指向):

  • 当地分公司(主)
  • 远程跟踪分支,与本地分支同步(与master相同的origin / 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)
    • 一般分离头: (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
  • git describe --all
    • 当地分公司: heads/master
    • 远程跟踪分支(同步): heads/master (注意:   remotes/origin/master
    • 远程跟踪分支(不同步): remotes/origin/feature-foo
    • 标签: v1.2.3
    • 一般分离头: v1.0.6-5-g2393761
  • cat .git/HEAD
    • 当地分公司: ref: refs/heads/master
    • 所有其他用例:相应提交的SHA
  • git rev-parse --abbrev-ref HEAD
    • 当地分公司: master
    • 所有其他用例: HEAD
  • git symbolic-ref --short HEAD
    • 当地分公司: master
    • 所有其他用例: fatal: ref HEAD is not a symbolic ref

(仅供参考,这是通过git版本1.8.3.1完成的)


168
2017-10-25 08:53



总而言之,似乎没有人能够完成手工操作。 - bukzor
这对我很有帮助: git describe --all --exact-match 2>/dev/null | sed 's=.*/==' 对我来说是最好的解决方案(标签和分支头的好名称,随机分离头没有输出。 - Alex Dupuy
但是,我刚发现使用了 git describe 当存在引用相同提交的多个分支时,例如严重失败,例如,之后 git checkout -b foo  - 它任意使用其中一个(似乎可能是最近创建的一个)。我将改变策略以使用过滤后的输出 git branch 并且只能使用 git describe 如果结果是一个分离头的东西。 - Alex Dupuy
实际上,我需要使用 git branch --no-color 确保文件名没有恼人的终端转义码。 - Alex Dupuy
这对我来说真的很有帮助,谢谢你这么彻底! - Alice Purcell


还有一个选择:

git name-rev --name-only HEAD

118
2017-11-02 19:17



它也可以用 echo ${$(git symbolic-ref --quiet HEAD)#refs/heads/} - Antoine
如果HEAD与主分支和功能分支相同(例如在合并期间),则它不起作用。即使在功能分支上执行,它也会返回'master'。 - Orest Hera
git checkout master && git name-rev --name-only HEAD # ac-187 它没有按预期工作 - Alexander Abashkin
我在合并之前将其保存到变量中,如果我签出特定的提交,我的HEAD可能会被取消。在这些情况下,这很好。 - Ishaan Sejwal
我是从Jenkins管道做的。所以这对我来说似乎是最好的答案。干 git branch --list 只是说 * (HEAD detached at 7127db5)。干 git rev-parse --abbrev-ref HEAD 只是说 HEAD 等等。 - Mig82


很简单,我把它放在一个班轮(bash)

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

(信用:有限赎罪)

当我在那里时,一个班轮来获得远程跟踪分支(如果有的话)

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

87
2018-04-04 15:20



太多的斜线! :) sed -n 's/\* //p' 诀窍。虽然我倾向于偏执狂,所以我会把它锚定 sed -n 's/^\* //p'。 - Mark Reed


您只需在Linux上的存储库目录中键入命令行(console):

$ git status

你会看到一些文字,其中有类似的东西:

...
On branch master
...

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


49
2018-06-05 20:31



根据您的想法,您可以使用 git status 并获得第一行输出 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
git status 如果有大量文件被管理,可能需要很长时间才能返回值。 - the Tin Man


git symbolic-ref -q --short HEAD

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


26
2017-10-02 22:09



谢谢,效果很好! - 我也在我的脚本中添加“-C path_to_folder”。 - Tony