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

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

2656630 次浏览
git branch

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


要仅检索您所在分支的名称:

git rev-parse --abbrev-ref HEAD

或使用Git 2.22及更高版本:

git branch --show-current

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

$ git status

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

...On branch master...

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

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


contrib/中的git-prompt.sh是如何做到的(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/}
    • If it doesn't start with 'ref: ', then it is detached HEAD (anonymous branch), pointing directly to some commit. Use git describe ... to write the current commit in human-readable form.

I hope that helps.

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

很简单,我把它放在一个衬里(bash)

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

(图片来源:Limited Atonement)

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

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

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

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

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

要显示只有您所在的当前分支的名称:

git rev-parse --abbrev-ref HEAD

参考:在Git中只显示当前分支

这个怎么样?

{ git symbolic-ref HEAD 2> /dev/null || git rev-parse --short HEAD 2> /dev/null } | sed "s#refs/heads/##"
git branch | grep "*" | sed "s/* //" | awk '{printf $0}' | pbcopy

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

git symbolic-ref -q --short HEAD

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

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

  • 本地分支(主)
  • 远程跟踪分支,与本地分支同步(源/主与主同时提交)
  • 远程跟踪分支,与本地分支不同步(起源/功能-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完成的)

找到一个与奥利弗·雷法罗的相同长度的命令行解决方案,使用良好的ol'awk:

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

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

如果您在Jenkins中运行,您可以使用GIT_BRANCH变量,如下所示:https://wiki.jenkins-ci.org/display/JENKINS/Git+Plugin

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

GIT_COMMIT-当前的SHA

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

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

GIT_URL-存储库远程URL

GIT_URL_N-有超过1个远程地址时的存储库远程URL,例如GIT_URL_1,GIT_URL_2

GIT_AUTHOR_EMAIL-投稿人/作者邮箱

GIT_COMMITTER_EMAIL-投稿人/作者邮箱

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

虽然其他一些解决方案很棒,但以下是我所做的(从雅各布的回答中简化):

git branch | grep \*

现在,

git status

工作,但是只有如果有任何局部更改

如果您真的希望最后一个分支/标记也在分离的HEAD状态下签出。

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

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

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

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

git status | sed -n 1p

说明:

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

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

"On branch your_branch_name"

还有一个选择:

git name-rev --name-only HEAD

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

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

#!/bin/bash
git branch | grep -e "^*"

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

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

$ git cbr* master

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

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

将只显示分支名称

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

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

给出原始输出:

$ git statusHEAD detached at 147049c[...]$ ./gime-branch.sha47be8d2167641088b66bf8f5c2bf7d3da0c642c HEAD^ 40a47be8dmaster HEAD^ 6master

您可以永久设置bash输出以显示您的git分支名称。当您使用不同的分支时,它非常方便,无需一直键入$ git status。github repogit-awating-提示.

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

mkdir ~/.bashcd ~/.bashgit clone git://github.com/jimeh/git-aware-prompt.git

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

export GITAWAREPROMPT=~/.bash/git-aware-promptsource "${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\]\$ "

在您之前粘贴安装代码的同一文件末尾。这将为您提供彩色输出:输入图片描述

使用Mac将其添加到PS1

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

在运行上面的命令之前:

在此处输入图片描述

运行该命令后:

在此处输入图片描述

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

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

git branch | grep ^\*

当你不想每次想知道分支并且使用Bash时都键入那个长命令时,给命令一个短别名,例如别名cb,就像这样。

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

当您处于分支主机并且您的提示符为$时,您将获得* master,如下所示。

$ cb* master

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

git status -b

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

-s

短以短格式输出。

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

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

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

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

-v--冗长除了已更改的文件名外,还显示要提交的暂存文本更改(即,像git diff--cache的输出)。如果指定两次-v,则还显示工作树中尚未暂存的更改(即,像git diff的输出)。

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

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

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

简单地,将以下行添加到您的~/.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

git status

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

e. g.

>git statusOn branch master // <-- branch name here.....

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

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

一个不那么嘈杂的git状态版本就可以了

git status -bsuno

它会打印出来

## branch-name

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

虽然git分支将向您显示所有分支并用星号突出显示当前分支,但在使用大量分支时它可能太麻烦了。

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

git rev-parse --abbrev-ref HEAD

我知道这已经被回答了,但是在Git的最新版本中,命令git branch在某种提示中打开了您的分支列表,您必须退出。这让我很恼火!

这是我的补丁:打开您的bash配置文件并输入:

#!/bin/bashgit() {if [[ $@ == "branch" ]] thencommand git branch -a | grep -v 'remotes'elsecommand git "$@"fi}

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

source ~/.zshrcgit branch

瞧!您的终端中打印出您当地分支机构的列表。

您正在写入bashrc文件的代码覆盖了git branch的默认函数,并将其替换为一个更长的命令,该命令通过-a参数列出了所有本地分支。然后我们grep取出额外的不需要的业务并打印出来。如果您排除grep命令,您仍然会得到烦人的提示。如果您不熟悉编写bash命令,请查看以下解释:关于.bash_profile,. bashrc,以及别名应该写在哪里?

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

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

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

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

git branch --show-current

根据手册页:

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

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

终端中键入命令:打开. git/HEAD输出文件包含当前分支的名称

参考:ref/current_working_branch

如果您的CI服务器没有带有分支名称的环境变量,并且您有一个容器内没有git二进制文件的dockerized构建,您可以使用:

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

我会尝试以下方法之一:

1.>git符号化引用

git symbolic-ref --short HEAD>>> sid-dev

2.>git分支

git branch --show-current>>> sid-dev

3.>git name-rev-name-Only HEAD

git name-rev –name-only HEAD>>> HEAD sid-dev

备注:

1.>git符号化引用显示对当前分支的HEAD的简短符号引用。这是当前分支的名称。

2.>#删除当前的git分支也是打印当前分支名称的简单有效的方法。

3.>git name-rev-Only HEAD相关链接给出了当前分支的HEAD修订版的符号名称

4.>在上面的例子中,sid-dev是我的分支的名称。

要在git use中获取当前分支,

git branch --show-current

有多种方法可以检查Git的当前分支,但我更喜欢:

git branch --show

即使git branch也会显示当前分支名称以及所有现有分支名称列表。

在Shell上,您可以执行以下操作

git branch | grep '*'

我一直在与CircleCI和git标签作斗争,这就是我最终得到的:

if [[ -n $(git branch --show-current) ]]; thengit branch --show-currentelsegit branch -a --contains $(git rev-parse --short HEAD) \| sed '/HEAD/d' \| sed 's/remotes\/origin\///g' \| sed 's/\*//g' | sed 's/ *//g' \| awk '!_[$0]++'fi

虽然有点难看,但确实如此

  • 为常规提交工作:它只是使用git的--show-current标志,如果有效,我们不需要再看了;本地和CI容器上
  • 为标签工作:当头被分离时,它将获得远程分支名称。

注意事项:

  • 只要标记的提交只出现在一个分支上,这就可以正常工作。因此,如果您通常合并为dev并从那里通过stagingproduction,那么dev的原始提交将出现在所有三个分支上,从而破坏此代码。但只要你只标记合并/PR提交
  • 这需要事先运行git fetch -a,因为CI只会检查默认分支和标记的提交,所以如果正确的分支都不是这些,它就不会工作

更多解释:

  • 我想获取分支名称,即使CI构建是由标记触发的。在这种情况下,CircleCIpipeline.git.branch变量未设置,我也无法轻松从git获取分支名称,因为头部已分离(正如许多其他问题中指出的那样)。这意味着greping当前分支(使用*前缀)在CI上也不起作用,当前分支将是分离的头部。
  • 这个想法是获取包含此提交(包括远程提交)的所有分支;然后删除分离的头结果,删除所有不是实际分支名称的位并删除重复

一个简单的黑客可以

git branch|grep "*"

输出:

* <current branch>

编辑:

了解当前分支的另一种方法

git status|head -1On branch <current branch name>

在终端中写入以下命令:

git branch | grep \*

git branch --show-current

或在Git 2.22及更高版本上:

  git branch --show
git log

此命令将在顶部显示当前分支名称的提交列表。

如果在分支上,只需当前分支的名称,但如果分离,则打印当前提交ID:

git symbolic-ref --short HEAD 2>/dev/null || git rev-parse --short HEAD

如果分离,第一部分将返回错误,第二部分将始终打印当前提交ID。

git branch -l

这将列出你所有的本地分支,你当前的分支被盯着并打印成绿色输入图片描述