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


2591

我来自Subversion的背景,当我有一个分支时,我知道我正在使用“这些工作文件指向此分支”进行操作。

但是,使用Git时,我不确定在NetBeans或Notepad ++中编辑文件时,是将文件绑定到主文件还是其他分支。

gitbash 没问题,它告诉我我在做什么。


11
让您的IDE显示文件.git/HEAD(可能在父目录中)
Tino 2012年

101



9
使用Git 2.22(Q2 2019),你将有一个更简单的方法:git branch --show-current在这里查看我的答案
VonC

Answers:


2299
git branch

应该显示您的仓库的所有本地分支。已加星号的分支是您当前的分支。

如果只想检索所在分支的名称,则可以执行以下操作:

git rev-parse --abbrev-ref HEAD

但这对Notepad ++和Netbeans没有帮助。只是git bash(和Probobly Vim),我提到了这一点。我正在尝试与其他Ide和文本编辑器(不作为命令行)一起工作。
mike628 2011年

@ mike628实际上,他们正在为您提供帮助,但您需要通过GUI进行访问。正确?
塔德克2011年

2
如果您愿意在Eclipse中工作,则有一个名为“ eGit”的程序,该程序具有一个GUI,它将告诉您其中所有存储库的当前分支。否则,我不知道..如果您想使用任何与您选择的程序兼容的插件,那么您将受制于该插件的创建者(如果有的话)。
roberttdev 2011年

2
在做一个git checkout --orphan foo然后git branch失败显示分支foo。鉴于git symbolic-ref HEAD建议另一个答案起作用。
马库斯·朱尼乌斯·布鲁图斯

2
downvote,我们只希望当前分支作为标准输出,而不是所有分支
Alexander Mills

4656

要显示当前所在的分支,而未列出其他分支,可以执行以下操作:

git rev-parse --abbrev-ref HEAD

参考:


132
@ChrisNelson,因为它仅显示当前分支,而不显示所有分支的长列表。
avakar 2012年

73
好人,可悲的是,如果您处于“分离的HEAD”状态(它只会输出“ HEAD”,这是完全没有用的),则它不起作用。
卡洛斯·坎德罗斯

34
我想通过git内部,如果您处于“分离的HEAD”状态,则不会跟踪它所属的分支,因为git branchshows * (no branch),它也没有用处……
CarlosCampderrós2013年

76
“ git symbolic-ref --short HEAD”也可以用于相同的目的
dusktreader 2013年

22
git rev-parse --abbrev-ref HEAD 2>/dev/null / dev / null部分可防止您看到错误,如果您刚刚创建了尚未包含HEAD的新存储库。
Paradiesstaub 2013年

523

您还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\///"

达里安2014年3月26日


7
与其他所有答案一样,当您处于“分离的HEAD”状态时,此方法不起作用
CarlosCampderrós2013年

51
@CarlosCampderrós:如果您处于分离的HEAD状态,则没有当前分支之类的东西。毕竟,零,一个或多个分支可能会影响您所处的提交。
Flimm 2014年

2
这使得在空Git仓库的问题时,有没有头
阿恩·

8
使用git版本2.4.4可以git rev-parse --abbrev-ref HEAD显示HEAD您何时处于分离状态。
彼得希尔

最好的答案仍然是,git symbolic-ref HEAD | sed -e "s/^refs\/heads\///" 因为它会像HEAD detached at a63917f处于分离状态时一样显示字符串,这与其他什么都不显示或不显示HEAD的答案不同。这个很重要。
伯纳德

264

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

  • 当地分公司(主管)
  • 远程跟踪分支,与本地分支同步(源/主机与主机相同的提交)
  • 远程跟踪分支,与本地分支不同步(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: Not a directory
    • 所有其他用例:对应提交的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完成的)


6
总而言之,似乎没有人能像我手工做的那样。
bukzor 2015年

6
这是相当有帮助的我:git describe --all --exact-match 2>/dev/null | sed 's=.*/=='是最好的解决办法,我(好名字标签和分支机构负责人,无输出随机分离的头。
亚历克斯·杜佩

1
但是,我刚刚发现,git describe当有多个分支引用同一提交时(例如紧接之后),使用会导致严重失败git checkout -b foo-它任意使用其中一个(似乎是最近创建的分支)。我将更改策略以使用过滤的输出,git branch并且仅git describe在结果与头部分离有关时才使用。
亚历克斯·杜普

实际上,我需要使用git branch --no-color确保文件名没有令人讨厌的终端转义码。
Alex Dupuy 2015年

2
这对我真的非常有用,非常感谢,感谢您的深入研究!
爱丽丝·珀赛尔


136

另一种选择:

git name-rev --name-only HEAD

也可以通过echo ${$(git symbolic-ref --quiet HEAD)#refs/heads/}
Antoine

12
如果HEAD与master和feature分支相同(例如,在合并过程中),它将不起作用。即使在功能分支上执行,它也会返回“ master”。
Orest Hera

1
git checkout master && git name-rev --name-only HEAD # ac-187它没有按预期的方式运行
Alexander Abashkin

我在合并之前将其保存到变量中,并且在我结帐特定提交的情况下,如果我的HEAD可能被解除连接,则将其保存。在这种情况下,可以正常工作。
伊桑·塞瓦尔

4
我正在通过詹金斯管道进行此操作。因此,这似乎暂时是我的最佳答案。这样做git branch --list只是说* (HEAD detached at 7127db5)。这样做git rev-parse --abbrev-ref HEAD只是说HEAD等。
Mig82 '17

91

好简单,我把它放在一根衬里(bash)

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

(信用:有限赎罪)

当我在那里的时候,一个班轮去了远程跟踪分支机构(如果有的话)

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

8
斜线太多!:) sed -n 's/\* //p'达到目的。尽管我倾向于偏执症,所以我会用偏执sed -n 's/^\* //p'
马克·里德

64

您只需在Linux的存储库目录中输入命令行(控制台)即可:

$ git status

您会看到一些文本,其中类似于:

...
On branch master
...

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


2
根据您要执行的操作,您可以使用git status并仅获得输出的第一行,其输出git status | head -1类似于# On branch master。我确定也需要考虑版本差异。
Joshua Pinter

@JoshPinter:您也可以使用git status | grep 'On branch',它应该具有相同的效果(应该,并不意味着如果您的Git版本显示的效果不同)。或git branch | grep '*',该名称将在分支的开头显示一个星号。
塔德克2012年

是的,它也很好,并且可能更灵活。在开发Rails应用程序中仅显示分支名称的最终结果是:<tick>git status | head -1<tick>.gsub('# On branch ', '')
Joshua Pinter 2012年

1
git status如果要管理许多文件,则可能需要很长时间才能返回值。
锡人

是的,例如,如果要在网页上打印分支,则git status可能会浪费整个页面的生成时间。
Artem Russakovskii

36
git symbolic-ref -q --short HEAD

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


1
谢谢,效果很好!-我还在此脚本中添加了“ -C path_to_folder”。
托尼

1
这是一个很好的解决方案,因为使用-q选项,它将以“分离的HEAD”状态返回错误代码,但不会将任何内容打印到stderr。
hallidave

这是在没有任何提交的情况下对我进行全新回购的唯一解决方案
kundasaba

26
git branch | grep -e "^*" | cut -d' ' -f 2

将仅显示分支名称


如果您的分支显示这样的标题“ *(HEAD在SUM_BRANCH_01处分离)”,则尝试使用此“ git分支| grep -e“ ^ *” | cut -d''-f 5 | cut -d')'-f 1 “
Dylan Kapp

我刚刚创建了这个完全相同的脚本来获取当前的分支名称。我认为这可能对差异有所帮助。
tggagne'8

25

git branch 仅显示当前分支名称。

虽然git branch将显示所有分支并用星号突出显示当前分支,但在使用许多分支时可能会很麻烦。

要仅显示您当前所在的分支,请使用:

git rev-parse --abbrev-ref HEAD

这对于ci和其他构建工具非常有用!
phouse512 '18

在脚本中使用它的最佳答案
Ben Keil,

1
@DylanNicholson git branch --contains有时会列出多个分支。
Joe Chacko

22

找到了与Oliver Refalo一样长的命令行解决方案,使用了很好的awk:

git branch | awk '/^\*/{print $2}'

awk读取为“在{}与正则表达式匹配的行中填充内容”。默认情况下,它采用空格分隔的字段,因此您打印第二个。如果可以假定只有分支所在的行带有*,则可以删除^。啊,打高尔夫球!


19
#!/bin/bash
function git.branch {
  br=`git branch | grep "*"`
  echo ${br/* /}
}
git.branch

18

为什么不使用git-aware shell提示,它会告诉您当前分支的名称? git status也有帮助。


如何git-prompt.shcontrib/做它(GIT版本2.3.0)中定义的__git_ps1辅助函数:

  1. 首先,在特殊情况下,如果检测到正在进行重新设置基准。Git在改基过程中使用未命名的分支(分离的HEAD)使其成为原子,原始分支保存在其他位置。

  2. 如果.git/HEAD文件是符号链接(从Git的古代历史来看非常罕见),则使用git symbolic-ref HEAD 2>/dev/null

  3. 否则,它读取.git/HEAD文件。后续步骤取决于其内容:

    • 如果此文件不存在,则没有当前分支。如果存储库是裸露的,通常会发生这种情况。

    • 如果以'ref: '前缀开头,.git/HEAD则为symref(符号引用),并且我们位于常规分支上。剥离此前缀以获得全名,剥离refs/heads/以获取当前分支的简称:

      b="${head#ref: }"
      # ...
      b=${b##refs/heads/}
      
    • 如果它不是以开头'ref: ',则它是分离的HEAD(匿名分支),直接指向某个提交。用于git describe ...以人类可读的形式编写当前提交。

希望对您有所帮助。


3
并且,如果您正在开发一个可识别git的shell提示,则应在此处使用哪些答案?乌龟一直向下。
三人房


4
git describe --contains --all HEAD我目前在此页的其他位置看不到哪个记录正在执行。如您所知,在StackOverflow上不建议仅链接的答案。
2015年

2
@tripleee:我添加了一个解释git-prompt.sh(又名__git_ps1)的方式
JakubNarębski2015年


16

抱歉,这是另一个命令行答案,但是当我发现此问题时,这就是我想要的东西,其中许多答案都很有帮助。我的解决方案是以下bash shell函数:

get_branch () {
    git rev-parse --abbrev-ref HEAD | grep -v HEAD || \
    git describe --exact-match HEAD 2> /dev/null || \
    git rev-parse HEAD
}

这应该总是给我一些既易于理解又可以直接用作的参数git checkout

  • 在本地分支机构上: feature/HS-0001
  • 在带标记的提交(分离)上: v3.29.5
  • 在远程分支(分离的,未标记的)上:SHA1
  • 在任何其他独立提交上:SHA1

1
感谢您发布此信息,其他答案似乎都不在乎总是产生可作为的参数的东西git checkout
zwol

15

您可以在工作目录命令上使用git bash如下

git status -b

它会告诉您所在的分支上有很多有用的命令,其中一些是

-s

--short以短格式给出输出。

-b --branch即使以短格式显示分支和跟踪信息。

--porcelain [=]以易于解析的格式为脚本提供输出。这类似于简短的输出,但是无论用户配置如何,在所有Git版本中都将保持稳定。有关详情,请参见下文。

version参数用于指定格式版本。这是可选的,默认为原始版本v1格式。

--long以长格式给出输出。这是默认值。

-v --verbose除了已更改文件的名称外,还显示已暂存的文本更改(即,例如git diff --cached的输出)。如果两次指定-v,那么还将显示尚未上演的工作树中的更改(即,类似于git diff的输出)。



13

随着时间的流逝,我们的分支列表可能会很长。

尽管其他一些解决方案也很棒,但是这是我的工作(从Jacob的回答中简化):

git branch | grep \*

现在,

git status

工作,但如果有任何局部变化


13

我建议使用这两个命令中的任何一个。

git branch | grep -e "^*" | cut -d' ' -f 2

要么

git status | sed -n 1p | cut -d' ' -f 3

或(更详细)

git status -uno -bs| cut -d'#' -f 3 | cut -d . -f 1| sed -e 's/^[ \t]//1'| sed -n 1p



12

那这个呢?

{ git symbolic-ref HEAD 2> /dev/null || git rev-parse --short HEAD 2> /dev/null } | sed "s#refs/heads/##"

1
更好的答案,因为它可以很好地处理分离的HEAD案例。
2013年

2
似乎您应该使用()而不是{}包装git命令
2013年

@Pat不需要为此生成单独的子shell,就像()那样。{}很好,除非您确实需要添加;。或}前的换行符。实际上,除非需要对命令进行分组,否则可以完全不使用{}。
aij 2015年

symbolic-ref部分是否还需要--short避免在分支名称前添加前缀refs/heads/
rjp

11

我有一个简单的脚本git-cbrcurrent branch),它打印出当前的分支名称。

#!/bin/bash

git branch | grep -e "^*"

我将此脚本放在了自定义文件夹(~/.bin)中。该文件夹位于中$PATH

因此,现在当我进入git repo时,只需键入git cbr即可打印出当前分支名称。

$ git cbr
* master

之所以有效,是因为该git命令采用第一个参数,然后尝试运行名称为的脚本git-arg1。例如,git branch尝试运行名为git-branch等的脚本。


11

您可以永久设置bash输出以显示git-branch名称。当您使用不同的分支时,这非常方便,无需一直输入$ git status。Github回购git-aware-prompt

打开终端(ctrl-alt-t)并输入命令

mkdir ~/.bash
cd ~/.bash
git clone git://github.com/jimeh/git-aware-prompt.git

使用sudo nano ~/.bashrc命令(对于Ubuntu)编辑.bashrc,并将以下内容添加到顶部:

export GITAWAREPROMPT=~/.bash/git-aware-prompt
source "${GITAWAREPROMPT}/main.sh"

然后粘贴代码

export PS1="\${debian_chroot:+(\$debian_chroot)}\[\033[01;32m\]\u@\h\[\033[00m\]:\[\033[01;34m\]\w\[\033[00m\] \[$txtcyn\]\$git_branch\[$txtred\]\$git_dirty\[$txtrst\]\$ "

在同一文件的末尾,您将安装代码粘贴到了前面。这将为您提供彩色输出:在此处输入图片说明


10

以下shell命令告诉您当前所在的分支。

git branch | grep ^\*

当您不想每次都想知道分支并且要使用Bash时都键入该长命令时,请为该命令提供一个简短的别名,例如alias cb,就像这样。

alias cb='git branch | grep ^\*'

当您在分支母版中并且提示是时$,将获得* master以下信息。

$ cb
* master

这不能为问题提供答案。要批评或要求作者澄清,请在其帖子下方发表评论。- 来自评论
Rashwan L

1
你为什么这么认为?
mrrusof

您应该在OP中评论和描述您的帖子,这样可以更轻松地理解您的帖子。
拉什万L

1
很有道理。
mrrusof

1
如果使用zsh,则需要将grep regex用单引号引起来:git branch | grep '^\*'
aaaarrgh

9

在分离头上时返回分支名称或SHA1:

git rev-parse --abbrev-ref HEAD | grep -v ^HEAD$ || git rev-parse HEAD

这是@ dmaestro12答案的简短版本,没有标签支持。


8
更好:git symbolic-ref --quiet --short HEAD || git rev-parse --short HEAD

8

如果您确实希望以分离的HEAD状态签出最后一个分支/标记。

git reflog HEAD | grep 'checkout:' | head -1 | rev | cut -d' ' -f1 | rev

更新 如果您有并且不害怕awk,这会更好。

git reflog HEAD | grep 'checkout:' | head -1 | awk '{print $NF}'

rev | cut -d' ' -f1| rev可以与简化awk '{print $NF}'
史蒂夫Buzonas

1
尽管这也不是万无一失的,但是由于您可以通过哈希检出特定的修订,因此reflog仅显示checkout: moving from ba7571b7fc5b8f31b8d0625821269afaa655577e to f68be8cf7bea917a5a0562b619e50368de0068a9它仍然是有用的技巧,可能有助于消除某些情况的歧义。
Alex Dupuy 2015年

1
进一步缩短为git reflog | awk '$3=="checkout:" {print $NF; exit}'
jthill '16

6

我知道这很晚,但是在linux / mac上,可以从终端使用以下命令。

git status | sed -n 1p

说明:

git status->获取工作树状态
sed -n 1p->获取状态正文的第一行

对以上命令的响应如下所示:

"On branch your_branch_name"

2
head -1将以通常的方式
bukzor 2015年

5

您还可以使用GIT_BRANCH变量,如下所示:https ://wiki.jenkins-ci.org/display/JENKINS/Git+Plugin

git插件设置了几个可以在脚本中使用的环境变量:

GIT_COMMIT-当前的SHA

GIT_BRANCH-当前正在使用的分支的名称,例如“ master”或“ origin / foo”

GIT_PREVIOUS_COMMIT-来自同一分支的先前构建提交的SHA(当前在第一个构建分支中的SHA)

GIT_URL-存储库远程URL

GIT_URL_N-存在多个远程数据库时的存储库远程URL,例如GIT_URL_1,GIT_URL_2

GIT_AUTHOR_EMAIL-提交人/作者的电子邮件

GIT_COMMITTER_EMAIL-提交人/作者的电子邮件


5

将其添加到PS1使用Mac:

PS1='\W@\u >`[ -d .git ] && git branch | grep  ^*|cut -d" " -f2`> $ '

在运行上面的命令之前:

在此处输入图片说明

运行该命令后:

在此处输入图片说明

不用担心,如果它不是GIT存储库,则不会显示错误,因为它会[-d .git]检查.git文件夹是否存在。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.