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

How to get the current branch name in Git?

我来自一个颠覆性的背景,当我有一个分支的时候,我知道我正在处理的是"这些工作文件指向这个分支"。

但是对于git,我不确定什么时候用netbeans或notepad++,编辑一个文件,不管它是绑定到master还是其他分支。

巴什的git没问题,它告诉我我在做什么。


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

1
git rev-parse --abbrev-ref HEAD

参考文献:

  • 仅以Git显示当前分支(2009年9月)


1
git branch

应显示回购的所有本地分支机构。星型分支是您当前的分支。

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

1
git branch | grep \* | cut -d ' ' -f2


您还拥有显示完整refspec的git symbolic-ref HEAD

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

1
$ git symbolic-ref --short HEAD

在Git v1.7+上,您还可以执行以下操作:

1
$ git rev-parse --abbrev-ref HEAD

如果您在一个分支上,两个分支都应该给出相同的分支名称。如果你是一个超然的人,答案是不同的。

Note:

On an earlier client, this seems to work:

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

– Darien 26. Mar 2014


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

  • 本地分行(主)
  • 远程跟踪分支,与本地分支同步(源站/主服务器与主服务器处于同一提交状态)
  • 远程跟踪分支,与本地分支不同步(源站/功能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)
  • 江户十一〔七〕号
    • 当地分支机构:# 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
  • 埃多克斯1〔14〕
    • 当地分支机构: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
  • 埃多克斯1〔25〕
    • 当地分支机构:master
    • 所有其他用例:HEAD
  • 埃多克斯1〔28〕
    • 当地分支机构:master
    • 所有其他用例:fatal: ref HEAD is not a symbolic ref

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


另一个选择:

1
git name-rev --name-only HEAD


很简单,我把它放在一行(bash)里。

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

(信用证:有限赔偿)

当我在那里的时候,一条线路去远程跟踪分支(如果有的话)

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


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

1
$ git status

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

1
2
3
...
On branch master
...

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


1
git symbolic-ref -q --short HEAD

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


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

只显示分支名称


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

虽然Git分支会显示所有分支并用星号突出显示当前的分支,但是在处理大量分支时,它可能太麻烦了。

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

1
git rev-parse --abbrev-ref HEAD


找到了与Oliver Refalo相同长度的命令行解决方案,使用good ol'awk:

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

awk的意思是"在与regex匹配的行上执行{}中的操作"。默认情况下,它采用空格分隔的字段,因此您将打印第二个字段。如果可以假定只有分支的行具有*,则可以删除^。啊,巴什高尔夫!


1
2
3
4
5
6
#!/bin/bash
function git.branch {
  br=`git branch | grep"*"`
  echo ${br/* /}
}
git.branch


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

来自contrib/的git-prompt.sh如何实现(git版本2.3.0),如__git_ps1helper函数中所定义:

  • 首先,如果检测到正在进行的重新平衡,则会出现特殊情况。Git在REBASE过程中使用未命名的分支(分离的头)使其成为原子分支,而原始分支保存在其他地方。

  • 如果.git/HEAD文件是一个符号链接(一个非常罕见的例子,来自git的古代历史),它使用git symbolic-ref HEAD 2>/dev/null

  • 否则,它读取.git/HEAD文件。接下来的步骤取决于其内容:

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

    • 如果它以'ref: '前缀开头,那么.git/HEAD是symref(符号引用),我们处于正常分支。去掉这个前缀得到全名,去掉refs/heads/得到当前分支的简称:

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

  • 希望有帮助。


    抱歉,这是另一个命令行答案,但当我发现这个问题时,我正在寻找这个答案,其中许多答案都很有用。我的解决方案是以下bash shell函数:

    1
    2
    3
    4
    5
    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


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

    1
    git status -b

    它会告诉你你在哪家分店有许多有用的命令,其中一些是

    1
    -s

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

    -B--分支以短格式显示分支和跟踪信息。

    --瓷[=]为脚本提供易于解析的输出格式。这类似于短输出,但在Git版本中保持稳定,无论用户配置如何。详情见下文。

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

    --长以长格式给出输出。这是默认设置。

    -V--详细除了已更改的文件名之外,还显示要提交的阶段性文本更改(如git diff的输出缓存)。如果指定了-v两次,那么还将显示工作树中尚未进行阶段化的更改(如git diff的输出)。


    一个低噪音版本的Git状态可以做到这一点。

    1
    git status -bsuno

    它打印出来

    1
    ## branch-name


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

    埃多克斯1〔17〕

    埃多克斯1〔18〕

    或(更详细)

    埃多克斯1〔19〕


    随着时间的推移,我们可能会有一个非常长的分支列表。

    虽然其他一些解决方案都很好,但下面是我的工作(从雅各布的回答中简化):

    1
    git branch | grep \*

    现在,

    1
    git status

    有效,但仅在有任何本地更改时有效


    在NetBeans中,确保启用了版本控制注释(视图->显示版本控制标签)。然后可以看到项目名称旁边的分支名称。

    http://netbeans.org/bugzilla/show_bug.cgi?内径=213582


    从2.22版的Git开始,您只需使用:

    1
    git branch --show-current


    这个怎么样?

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


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

    1
    2
    3
    #!/bin/bash

    git branch | grep -e"^*"

    我把这个脚本放在一个自定义文件夹(~/.bin中)。文件夹在$PATH中。

    所以现在我在Git回购中,只需输入git cbr就可以打印出当前的分支名称。

    1
    2
    $ git cbr
    * master

    这是因为git命令接受其第一个参数并尝试运行一个名为git-arg1的脚本。例如,git branch试图运行一个名为git-branch的脚本,等等。


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

    1
    git branch | grep ^\*

    当您不想在每次想要了解分支和使用bash时都输入长命令时,请给该命令一个简短的别名,例如alias cb,就像这样。

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

    当您在分支主系统中,提示为$时,您将得到* master如下。

    1
    2
    $ cb
    * master


    您可以永久设置bash输出以显示Git分支名称。使用不同的分支时非常方便,不需要一直输入$ git status。GitHub回购Git感知提示.

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

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

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

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

    然后粘贴代码

    1
    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\]\$"

    在同一个文件的末尾,您将安装代码粘贴到了前面的文件中。这将为您提供彩色输出:enter image description here


    1
    git status

    还将提供分支名称和更改。

    例如

    1
    2
    3
    >git status
    On branch master // <-- branch name here
    .....


    如果您真的希望最后一个分支/标记也以分离的头部状态签出。

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

    更新这是更好的,如果你有和不害怕awk。

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


    在分离的头上返回分支名称或sha1:

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

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


    我知道这很晚了,但是在Linux/Mac上,从终端上可以使用以下内容。

    1
    git status | sed -n 1p

    说明:

    git status->获取工作树状态sed-n 1p->从状态体获取第一行

    对上述命令的响应如下:

    1
    "On branch your_branch_name"


    您还可以使用git_分支变量,如下所示:https://wiki.jenkins-ci.org/display/jenkins/git+插件

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

    Git_commit-当前的sha

    Git_Branch-当前使用的分支的名称,例如"master"或"origin/foo"

    git_previous_commit-来自同一分支的上一个已生成commit的sha(第一个内置分支上的当前sha)

    Git_URL-存储库远程URL

    Git_url_n-当远程数超过1个时,存储库远程URL,例如Git_url_1、Git_url_2

    Git_作者电子邮件-提交人/作者电子邮件

    Git提交人电子邮件-提交人/作者电子邮件


    使用mac将其添加到PS1中:

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

    在运行上述命令之前:

    氧化镁

    运行该命令后:

    氧化镁

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


    1
    git branch | grep"*" | sed"s/* //" | awk '{printf $0}' | pbcopy

    将结果直接复制到粘贴板。感谢@olivier refalo的首发…


    使用之前的想法;假设sha1是40个字符;并跟踪引用(是的,应该删除调试打印行:-):

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    git reflog | awk '
    $3 =="checkout:" && (sha =="" || sha == $1 ) {
      from=$(NF - 2)
      to=$NF
      print from, to, length(from) >"/dev/stderr"
      if (length(from) != 40) { print from ; exit; }
      sha=substr(from, 1, 7)
      print sha >"/dev/stderr"
    }
    '

    给出原始输出:

    1
    2
    3
    4
    5
    6
    7
    8
    $ git status
    HEAD detached at 147049c
    [...]
    $ ./gime-branch.sh
    a47be8d2167641088b66bf8f5c2bf7d3da0c642c HEAD^ 40
    a47be8d
    master HEAD^ 6
    master

    使用git branch --contains HEAD | tail -1 | xargs,它也适用于"分离头"状态。


    简单地说,在您的~/.bash_profile中添加以下行:

    1
    2
    3
    4
    branch_show() {
         git branch 2> /dev/null | sed -e '/^[^*]/d' -e 's/* \(.*\)/ (\1)/'
    }
    export PS1="\u@\h \[\033[32m\]\w\[\033[33m\]\$(branch_show)\[\033[00m\] $"

    这样,您就可以在终端中使用当前的分支名称。

    由coderwall.com提供


    我知道这个问题已经得到了解决,但是在最新版本的git中,命令git branch以某种提示打开了一个分支列表,您必须退出。这让我烦到了极点!

    我的解决方法是:打开您的bash配置文件并在以下位置键入:

    1
    2
    3
    4
    5
    6
    7
    8
    #!/bin/bash
    git() {
      if [[ $@ =="branch" ]] then
        command git branch -a | grep -v 'remotes'
      else
        command git"$@"
      fi
    }

    现在打开终端并通过在git repo中键入以下命令进行测试:

    1
    2
    source ~/.zshrc
    git branch

    瞧!您的本地分支的列表将在终端中打印出来。

    您正在写入bashrc文件的代码覆盖了git branch的默认函数,并用一个更长的命令替换它,该命令通过-a参数列出所有本地分支。然后我们把多余的不需要的业务打印出来。如果你不使用grep命令,你仍然会得到恼人的提示。如果您不熟悉编写bash命令,请签出以下说明:about.bash_profile、.bashrc,别名应该写在哪里?


    仅获取本地分支名称:

    1
    git status -b -u no | awk 'NR==1{print $3;}'

    仅获取远程分支名称:

    1
    git status -b -u no | awk 'NR==2{print $6;}'

    git status -b -u no | awk 'NR==2{print $6;}' | tr -d"[.']"从输出中删除特殊字符


    您可以用一条grep指令来完成这项工作,使用perl模式和\K来重置匹配缓冲区,这样您只得到分支名称。

    1
    2
    $ git branch | grep -oP"^\*\s+\K\S+$"
    master