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

时间:2011-06-05 20:13:44

标签: git branch git-branch

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

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

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

39 个答案:

答案 0 :(得分:4212)

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

git rev-parse --abbrev-ref HEAD

参考:

答案 1 :(得分:1666)

git branch

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

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

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

答案 2 :(得分:471)

您还有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月

答案 3 :(得分:213)

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

  • 当地分公司(主人)
  • 远程跟踪分支,与本地分支同步(与master相同提交的origin / master)
  • 远程跟踪分支,不与本地分支(origin / feature-foo)同步
  • tag(v1.2.3)
  • 子模块(在子模块目录中运行)
  • 一般分离头(以上都不是)

结果:

  • git branch | sed -n '/\* /s///p'
    • 本地分支:master
    • 远程跟踪分支(同步):(detached from origin/master)
    • 远程跟踪分支(不同步):(detached from origin/feature-foo)
    • tag:(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
    • tag:# 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
    • tag: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完成的)

答案 4 :(得分:130)

还有一个选择:

git name-rev --name-only HEAD

答案 5 :(得分:90)

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

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

(信用:有限赎罪)

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

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

答案 6 :(得分:62)

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

$ git status

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

...
On branch master
...

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

答案 7 :(得分:31)

git symbolic-ref -q --short HEAD

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

答案 8 :(得分:25)

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

将仅显示分支名称

答案 9 :(得分:23)

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

虽然git branch会显示所有分支并用星号突出显示当前分支,但在使用大量分支时它可能过于繁琐。

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

git rev-parse --abbrev-ref HEAD

答案 10 :(得分:23)

找到一个与Oliver Refalo's长度相同的命令行解决方案,使用好的'awk:

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

awk将其视为“在匹配正则表达式的行上{}中的内容”。默认情况下,它假定以空格分隔的字段,因此您打印第二个字段。如果您可以假设只有您的分支的行具有*,则可以删除^。啊,打击高尔夫!

答案 11 :(得分:18)

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

答案 12 :(得分:16)

从git版本2.22开始,您可以使用:

BsonSerializer.RegisterSerializationProvider(new CustomSerializationProvider());

答案 13 :(得分:16)

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


来自contrib/的{​​{3}}如何(git版本2.3.0),如__git_ps1辅助函数中所定义:

  1. 首先,如果检测到 rebase 正在进行中,则会有特殊情况。 Git在rebase过程中使用未命名的分支(分离的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 ...以人类可读的形式编写当前提交。

  4. 我希望有所帮助。

答案 14 :(得分:15)

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

git status -b

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

-s

- 短 以短格式输出。

-b - 科 即使是短格式也能显示分支和跟踪信息。

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

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

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

-v --verbose 除了已更改的文件的名称之外,还显示要提交的文本更改(即,类似于git diff --cached的输出)。如果指定了-v两次,那么还会显示工作树中尚未暂存的更改(即,与git diff的输出一样)。

答案 15 :(得分:13)

git status的嘈杂版本可以解决这个问题

git status -bsuno

打印出来

## branch-name

答案 16 :(得分:13)

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

虽然其他一些解决方案很棒,但这就是我所做的(简要来自Jacob的回答):

git branch | grep \*

现在,

git status

有效,但如果有任何本地更改

答案 17 :(得分:13)

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

enum Line { case Horizontal(Float) case Vertical(Float) } let leftEdge = Line.Horizontal(0.0) let leftMaskRightEdge = Line.Horizontal(0.05) guard case .Horizontal(let leftEdgeValue) = leftEdge else { fatalError() } print(leftEdgeValue)

OR

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

OR(更详细)

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

答案 18 :(得分:13)

对不起,这是另一个命令行答案,但是当我发现这个问题并且其中许多答案都有帮助时,我正在寻找这个问题。我的解决方案是以下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

答案 19 :(得分:12)

在Netbeans中,确保启用版本控制注释(查看 - &gt;显示版本控制 标签)。然后,您可以在项目名称旁边看到分支名称。

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

答案 20 :(得分:11)

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

#!/bin/bash

git branch | grep -e "^*"

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

所以现在当我在git仓库中时,我只需输入git cbr即可打印出当前的分支名称。

$ git cbr
* master

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

答案 21 :(得分:11)

这个怎么样?

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

答案 22 :(得分:10)

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

git branch | grep ^\*

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

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

当您在分校主管并且提示为$时,您将获得* master,如下所示。

$ cb
* master

答案 23 :(得分:9)

您可以永久设置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\]\$ "

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

答案 24 :(得分: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}'

答案 25 :(得分:8)

git status 

还会给出分支名称以及更改。

e.g。

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

答案 26 :(得分:7)

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

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

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

答案 27 :(得分:6)

我知道这已经晚了但是在linux / mac上,你可以从终端使用以下内容。

git status | sed -n 1p

说明:

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

对上述命令的响应如下:

"On branch your_branch_name"

答案 28 :(得分: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 - 提交者/作者电子邮件

答案 29 :(得分:5)

使用Mac将其添加到PS1

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

在运行上述命令之前:

enter image description here

运行该命令后:

enter image description here

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

答案 30 :(得分:3)

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

直接将结果复制到粘贴板。感谢@ olivier-refalo的开始...

答案 31 :(得分:2)

使用早期的想法;假设sha1是40个字符;和追逐引用(是的,应该删除调试打印行: - ):

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"
}
'

给出原始输出:

$ git status
HEAD detached at 147049c
[...]
$ ./gime-branch.sh
a47be8d2167641088b66bf8f5c2bf7d3da0c642c HEAD^ 40
a47be8d
master HEAD^ 6
master

答案 32 :(得分:1)

只需将以下几行添加到~/.bash_profile

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提供

答案 33 :(得分:1)

使用git branch --contains HEAD | tail -1 | xargs还可用于“分离的HEAD”状态。

答案 34 :(得分:1)

您还可以在当前项目的.git目录中看到当前分支的名称。

终端中的

type命令:打开.git / HEAD 输出文件包含当前分支的名称 ref:refs / heads / {current_working_branch}

答案 35 :(得分:1)

如果您的CI服务器没有带有分支名称的环境变量,并且您具有在容器内部没有git二进制文件的dockerized版本,则可以使用:

cat .git/HEAD | awk -F '/' '{print $NF}'

答案 36 :(得分:0)

我知道这已经得到了解答,但是在最新版本的Git中,命令git branch会在某种提示中打开您的分支列表,您必须退出。哪个让我烦恼不已!

这是我的修复: 打开您的bash配置文件并在以下位置输入:

#!/bin/bash
git() {
  if [[ $@ == "branch" ]] then
    command git branch -a | grep -v 'remotes'
  else
    command git "$@"
  fi
}

现在打开终端并通过在git repo中输入以下命令来测试它:

source ~/.zshrc
git branch 

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

您写入bashrc文件的代码会覆盖git branch的默认函数,并用更长的命令替换它,该命令通过-a参数列出所有本地分支。然后我们grep了解额外的不需要的业务并将其打印出来。如果排除grep命令,您仍会收到烦人的提示。如果您不熟悉编写bash命令,请查看以下解释:About .bash_profile, .bashrc, and where should alias be written in?

答案 37 :(得分:0)

仅获取本地分支名称:

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

仅获取远程分支名称:

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

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

答案 38 :(得分:0)

您可以使用单个grep指令执行此操作,使用Perl模式和\K重置匹配缓冲区,因此仅获得分支名称。

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