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

3971

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


15
让你的集成开发环境(IDE)显示文件.git/HEAD,可能位于父目录中。 - Tino
124
显示Git中当前分支的命令是:$ git rev-parse --abbrev-ref HEAD - Fantastory
3
可能是重复的问题:如何以编程方式确定当前检出的Git分支 - tripleee
2
启用NetBeans中的“视图->显示版本标签”,然后您所需要做的就是将鼠标悬停在项目(或文件,或收藏夹)文件夹上,即可查看当前分支。 - idclaar
9
可能是在Git中仅显示当前分支的重复问题。 - techraf
显示剩余6条评论
51个回答

9
一个简单的解决方法是:
git branch|grep "*"

输出:

* <current branch>

编辑:

知道当前分支的另一种方法

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

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}' - Steve Buzonas
1
虽然这也不是绝对可靠的,因为您可以通过哈希检出特定版本,以便reflog仅显示“checkout:从ba7571b7fc5b8f31b8d0625821269afaa655577e移动到f68be8cf7bea917a5a0562b619e50368de0068a9”,但这仍然是一个有用的技巧,可能有助于消除某些情况的歧义。 - Alex Dupuy
2
进一步缩短为 git reflog | awk '$3=="checkout:" {print $NF; exit}' - jthill

7
如果您在Jenkins中运行,您可以使用GIT_BRANCH变量,如下所示: https://wiki.jenkins-ci.org/display/JENKINS/Git+Plugin Git插件设置了几个环境变量,您可以在脚本中使用:
1. GIT_COMMIT - 当前SHA 2. GIT_BRANCH - 当前使用的分支名称,例如“master”或“origin/foo” 3. GIT_PREVIOUS_COMMIT - 同一分支上先前构建的提交的SHA(第一次构建时为当前SHA) 4. GIT_URL - 存储库远程URL 5. GIT_URL_N - 当存在多个远程库时,存储库远程URL,例如GIT_URL_1,GIT_URL_2 6. GIT_AUTHOR_EMAIL - 提交者/作者电子邮件 7. GIT_COMMITTER_EMAIL - 提交者/作者电子邮件

6
我知道现在有点晚了,但是在Linux/Mac上,你可以从终端使用以下命令。
git status | sed -n 1p

解释:

git status -> 获取工作目录状态
sed -n 1p -> 从状态内容中获取第一行

对于以上命令的响应结果将会如下所示:

"On branch your_branch_name"

2
head -1 是通常的方式。 - bukzor

5

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


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文件夹是否存在。

5

我想要一行代码,可以在Windows CMD shell中解析(这里的大多数答案使用unix命令)。大多数答案也存在稀疏检出和分离头的问题。

git branch

列出工作副本中可用的分支列表,其中选中的分支前面带有*号。这对于快速查看很有用,但不适合解析。

git rev-parse --abbrev-ref HEAD

当在分离的 HEAD 检出上使用时,只显示HEAD作为分支。同样地,当使用时

git symbolic-ref HEAD

当我使用一个来自标签的分离头时,出现了致命错误:ref HEAD不是符号引用

git describe --contains --all HEAD

看起来大部分时间都能工作,并且接近我想要的,但是对于一些仓库只返回了一个空行。

git status

这段代码可以正常工作,但它会列出仓库中的所有差异,这使得解析变得有点困难。

最终我选择了以下代码;

git status |findstr/n ^^|findstr "^[1]: ^[0]:"

这将输出如下内容:

1:HEAD分离于2.30.20

或者

1:在主分支上


4

如果你的CI服务器没有分支名称的环境变量,并且你使用的是不带有容器内部的git二进制文件的docker化构建,那么可以使用以下命令:

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


不幸的是,这不能被持续地依赖,因为CI服务器可能会执行无头检出,所以文件.git/HEAD只包含相应提交的SHA。 - Matt Clegg
2
根据@MattClegg的评论,使用cat是多余的。只需执行awk -F '/' '{print $NF}' $PATH/to/.git/HEAD即可。 - Jim
如果你的分支名为 feature/foo,那么它也会失败,因为你只会得到 foo - Troy Daniels

4

我一直在与 CircleCI 和 git 标签进行抗争,最终得出了以下结果:

if [[ -n $(git branch --show-current) ]]; then
    git branch --show-current
else
    git 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容器上都适用。
  • 适用于标签:当HEAD分离时,它将获取远程分支名称。

注意事项:

  • 只要打了一个标签的提交只出现在一个分支上这才起作用。所以如果你通常是从dev合并到staging然后通过production,则原始提交将出现在所有三个分支上,从而破坏此代码。但只要您仅针对合并/PR提交打标签,它便可行。
  • 这需要先运行git fetch -a,因为CI只会检出默认分支和标记的提交,所以如果正确的分支不是这些分支之一,则无法工作。

更多解释:

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

3

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

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

第一部分如果未附加,则会返回错误,第二部分将始终打印当前提交ID。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接