ChatGPT解决这个技术问题 Extra ChatGPT

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

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

让您的 IDE 显示文件 .git/HEAD,可能在父目录中
stackoverflow.com/questions/1417957/… $ git rev-parse --abbrev-ref HEAD
使用 Git 2.22(2019 年第二季度),您将有一个更简单的方法:git branch --show-current。请参阅my answer here

M
Mateen Ulhaq

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

git rev-parse --abbrev-ref HEAD

参考:Show just the current branch in Git


好一个,遗憾的是,如果您处于“分离的 HEAD”状态(它只是输出“HEAD”,这完全没用),它就不起作用。
我猜如果您处于“分离 HEAD”状态,则 git 内部不会跟踪它所属的分支,因为 git branch 显示 * (no branch),这也是无用的......
“git symbolic-ref --short HEAD”也适用于同样的目的
git rev-parse --abbrev-ref HEAD 2>/dev/null 如果您刚刚创建了一个尚未 HEAD 的新存储库,则 /dev/null 部分可防止您看到错误。
git symbolic-ref --short HEAD 似乎更通用。如果 repo 是刚刚初始化的,则 git rev-parse --abbrev-ref HEAD 产生 HEAD
M
Mateen Ulhaq
git branch

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

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

git rev-parse --abbrev-ref HEAD

或使用 Git 2.22 及更高版本:

git branch --show-current

但这对 Notepad++ 和 Netbeans 没有帮助。只是 git bash (和可能的 Vim),我提到了这一点。我正在尝试使用其他没有命令行的 Ide 和文本编辑器。
@mike628 实际上他们正在帮助你,除非你想通过 GUI 访问一些东西。正确的?
如果你愿意在 Eclipse 中工作,有一个名为“eGit”的程序,它有一个 GUI,可以告诉你其中所有 repos 的当前分支。否则,我不知道..您将受制于您想要使用的与您选择的程序兼容的任何插件的创建者(如果有的话)。
在执行 git checkout --orphan foo 之后,git branch 未能显示分支 foo。而建议的 git symbolic-ref HEAD 另一个答案有效。
git rev-parse --abbrev-ref HEAD 究竟做了什么?我以前使用 git describe --contains --all HEAD 但有时会中断,我不太清楚为什么。
C
Community

您还有 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 2014 年 3 月 26 日


与所有其他答案一样,当您处于“分离 HEAD”状态时,这不起作用
@CarlosCampderrós:如果您处于分离的 HEAD 状态,则没有当前分支之类的东西。毕竟,您所在的提交可能可以通过零个、一个或多个分支到达。
当没有 HEAD 时,这会在空的 git 存储库中产生问题
使用 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。这个很重要。
D
Delgan

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

本地分支(主)

远程跟踪分支,与本地分支同步(origin/master 与 master 提交相同)

远程跟踪分支,与本地分支不同步(origin/feature-foo)

标签 (v1.2.3)

子模块(在子模块目录中运行)

一般分离头(以上都不是)

结果:

git 分支 | sed -n '/\* /s///p' 本地分支:master 远程跟踪分支(同步):(与 origin/master 分离)远程跟踪分支(不同步):(与 origin/feature-foo 分离) 标签:(从 v1.2.3 分离)子模块:(HEAD 在 285f294 分离)一般分离头:(从 285f294 分离)

本地分支:master

远程跟踪分支(同步):(与源/主分离)

远程跟踪分支(不同步):(与 origin/feature-foo 分离)

标签:(从 v1.2.3 分离)

子模块:(HEAD 在 285f294 分离)

一般分离头:(从285f294分离)

混帐状态 | head -1 本地分支:# 在分支上 master 远程跟踪分支(同步):# HEAD 在 origin/master 远程跟踪分支分离(不同步):# HEAD 在 origin/feature-foo 标签分离:# HEAD 在 v1 分离.2.3 submodule: # HEAD detached at 285f294 general detached head: # HEAD detached at 285f294

local branch: # 在主分支上

远程跟踪分支(同步):# HEAD 在 origin/master 分离

远程跟踪分支(不同步):# HEAD 在 origin/feature-foo 分离

tag: # HEAD 在 v1.2.3 分离

子模块:# HEAD 在 285f294 分离

general detached head: # HEAD detached at 285f294

git describe --all 本地分支:heads/master 远程跟踪分支(同步):heads/master(注意:不是 remotes/origin/master) 远程跟踪分支(不同步):remote/origin/feature-foo 标签: v1.2.3 子模块:remote/origin/HEAD 通用分离头:v1.0.6-5-g2393761

本地分支:heads/master

远程跟踪分支(同步):heads/master(注意:不是 remotes/origin/master)

远程跟踪分支(不同步):remote/origin/feature-foo

标签: v1.2.3

子模块:遥控器/原点/头

通用分离头:v1.0.6-5-g2393761

cat .git/HEAD:本地分支:ref:refs/heads/master 子模块:cat:.git/HEAD:不是目录所有其他用例:相应提交的 SHA

本地分支: ref: refs/heads/master

子模块:cat:.git/HEAD:不是目录

所有其他用例:相应提交的 SHA

git rev-parse --abbrev-ref HEAD 本地分支:掌握所有其他用例:HEAD

本地分支:master

所有其他用例:HEAD

git symbolic-ref --short HEAD 本地分支:掌握所有其他用例:致命:ref HEAD 不是符号引用

本地分支:master

所有其他用例:致命:ref HEAD 不是符号 ref

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


总之,似乎没有人能像我那样手工完成。
这对我很有帮助:git describe --all --exact-match 2>/dev/null | sed 's=.*/==' 对我来说是最好的解决方案(标签和分支头的好名字,随机分离头没有输出。
但是,我刚刚发现,当有多个分支引用同一个提交时,使用 git describe 会严重失败,例如在 git checkout -b foo 之后 - 它任意使用其中一个(似乎可能是最近创建的一个)。我将更改策略以使用来自 git branch 的过滤输出,并且仅在结果与头部分离时使用 git describe
实际上,我需要使用 git branch --no-color 来确保文件名没有烦人的终端转义码。
“当前分支”(由 checkout foo 设置)和“当前提交”是 2 个不同的概念。 symbolic-ref 只查看活动分支。 describe 只查看一个提交,并从所有指向它(或靠近它)的分支/标签中启发式地选择。像 branchstatus 这样的 DWIM 命令在定义时使用当前分支,但 all 在所有“分离的 HEAD”情况下都会进行启发式选择。
n
nh2

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

git branch --show-current

根据手册页:

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


是的,我去年三月在该页面的评论中提到了这一点:stackoverflow.com/questions/6245570/…。在 stackoverflow.com/a/55088865/6309 中。
至少提到这在分离的 HEAD 状态下不起作用。只是浪费了几个小时让 git 2.22 编译...
它不显示分支名称。它所显示的只是主要的
这很奇怪。你确定你正在运行至少 2.22 吗?
F
Filip Spiridonov

另一种选择:

git name-rev --name-only HEAD

它也可以用 echo ${$(git symbolic-ref --quiet HEAD)#refs/heads/} 检索
如果主分支和特性分支的 HEAD 相同(例如在合并期间),则它不起作用。即使在功能分支上执行,它也会返回“master”。
git checkout master && git name-rev --name-only HEAD # ac-187 它没有按预期工作
我在合并之前将它保存到一个变量中,并且如果我签出特定的提交,我的 HEAD 可能会被解除连接。在这些情况下,这工作正常。
我正在通过 Jenkins 管道执行此操作。所以这似乎是目前对我来说最好的答案。执行 git branch --list 只会说 * (HEAD detached at 7127db5)。做 git rev-parse --abbrev-ref HEAD 只是说 HEAD 等等。
O
Olivier Refalo

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

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

(信用:有限赎罪)

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

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

斜线太多了! :) sed -n 's/\* //p' 可以解决问题。虽然我倾向于偏执,所以我会用 sed -n 's/^\* //p' 锚定它。
T
Tadeck

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

$ git status

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

...
On branch master
...

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


根据您想要执行的操作,您可以使用 git status 并使用 git status | head -1 仅获取第一行输出,这会产生类似于 # On branch master 的内容。我确信版本差异也需要考虑在内。
@JoshPinter:您也可以使用git status | grep 'On branch',它应该具有相同的效果(应该,并不意味着如果您的 Git 版本以不同的方式显示它)。或 git branch | grep '*',它将显示分支的名称,并在其开头带有星号。
是的,这也有效,并且可能更灵活。我在开发 Rails 应用程序中仅显示分支名称的最终结果是:<tick>git status | head -1<tick>.gsub('# On branch ', '')
如果要管理大量文件,git status 可能需要很长时间才能返回值。
是的,例如,如果您想在网页上打印分支,git status 可能会占用整个页面的生成时间。
K
Kousha
git symbolic-ref -q --short HEAD

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


谢谢,很好用! - 我还在我的脚本中添加了“-C path_to_folder”。
这是一个很好的解决方案,因为使用 -q 选项,它会在“分离的 HEAD”状态下返回错误代码,但不会将任何内容打印到 stderr。
这是在没有任何提交的情况下在新的回购中为我工作的唯一解决方案
v
vidur punj

在终端中写入以下命令:

git branch | grep \*

或者

git branch --show-current

或者

  git branch --show

R
Rose

要在 git 使用中获取当前分支,

git branch --show-current

您必须最终编辑此评论并删除有问题的破折号,人们复制粘贴答案
你好@sych抱歉——这个命令中的破折号有什么问题?这可以很好地复制粘贴在我的机器上(Linux,薄荷味,git 版本 2.25.1)
@Rose 编辑后就可以了 :)
u
ungalcrys
git branch | grep -e "^*" | cut -d' ' -f 2

将仅显示分支名称


如果您的分支显示类似“* (HEAD detached at SUM_BRANCH_01)”,那么试试这个“git branch | grep -e "^*" | cut -d' ' -f 5 | cut -d ')' -f 1 "
我刚刚创建了这个完全相同的脚本来获取当前的分支名称。我认为它可能有助于差异。
L
Lawrence Paje

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

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

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

git rev-parse --abbrev-ref HEAD

这对 ci 和其他构建工具非常有用!
在脚本中使用它的最佳答案
@DylanNicholson git branch --contains 有时会列出多个分支。
C
Community

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

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

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


d
dgolovin

一个噪音较小的 git status 版本可以解决问题

git status -bsuno

它打印出来

## branch-name

## 开发...起源/开发
J
Jakub Narębski

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

contrib/ 中的 git-prompt.sh 是如何做到的(git 版本 2.3.0),如 __git_ps1 辅助函数中所定义:

首先,如果检测到 rebase 正在进行中,则存在特殊情况。 Git 在 rebase 过程中使用未命名的分支(分离的 HEAD)使其具有原子性,并且原始分支保存在其他地方。如果 .git/HEAD 文件是符号链接(非常罕见的情况,来自 Git 的古代历史),它使用 git symbolic-ref HEAD 2>/dev/null 否则,它读取 .git/HEAD 文件。下一步取决于其内容:如果此文件不存在,则没有当前分支。如果存储库是裸露的,通常会发生这种情况。如果它以 'ref:' 前缀开头,那么 .git/HEAD 是 symref(符号引用),我们在正常分支上。去掉这个前缀得到全名,去掉 refs/heads/ 得到当前分支的短名称: b="${head#ref: }" # ... b=${b##refs/heads/} If它不以'ref:'开头,然后它是分离的HEAD(匿名分支),直接指向某个提交。使用 git describe ... 以人类可读的形式编写当前提交。

我希望这会有所帮助。


如果你正在开发一个支持 git 的 shell 提示符,你应该使用这里的哪个答案?乌龟一路下来。
记录在案的似乎正在执行git describe --contains --all HEAD,我目前在此页面的其他地方没有看到。我相信您知道,在 StackOverflow 上不建议仅使用链接的答案。
@tripleee:我添加了一个解释 git-prompt.sh(又名 __git_ps1)是如何做到的......
d
dmaestro12

抱歉,这是另一个命令行答案,但这就是我发现这个问题时正在寻找的,其中许多答案很有帮助。我的解决方案是以下 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 checkout 的参数的东西。
D
Dziamid
#!/bin/bash
function git.branch {
  br=`git branch | grep "*"`
  echo ${br/* /}
}
git.branch

P
Prateek Gangwal

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

git status -b

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

-s

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

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

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

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

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

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


k
karthikr

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

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

git branch | grep \*

现在,

git status

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


P
Paul Rooney
git status 

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

例如

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

S
Siddharth Satpathy

我会尝试以下方法之一:

1.> git symbolic-ref --short HEAD

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

2.> git branch --show-current

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

3.> git name-rev –name-only HEAD

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

笔记:

1.> git symbolic-ref --short HEAD 显示对当前分支 HEAD 的短符号引用。这是当前分支名称。

2.> git branch --show-current 也是打印当前分支名称的一种简单高效的方法。

3.> git name-rev –name-only HEAD 给出当前分支的 HEAD 修订的符号名称

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


P
Prabhu Nandan Kumar

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

git branch --show

甚至 git branch 也显示当前分支名称以及所有现有分支名称列表。


j
jackotonye

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

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


S
Saroj

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

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


启用版本注释后,您只需将鼠标悬停在项目(或文件或收藏夹)文件夹上即可查看当前分支。
S
ShogunPanda

那这个呢?

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

更好的答案,因为它可以很好地处理分离的 HEAD 案例。
似乎您应该使用 () 而不是 { } 来包装 git 命令
@Pat 不需要像 ( ) 那样为此生成一个单独的子shell。 { } 很好,除了你需要添加一个 ;或 } 前的换行符。实际上,除非您需要对命令进行分组,否则您可以完全不使用 { }。
symbolic-ref 部分是否也需要 --short 以避免在分支名称前加上 refs/heads/ 前缀?
m
mrrusof

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

git branch | grep ^\*

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

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

当您在分支 master 中并且您的提示符为 $ 时,您将获得 * master,如下所示。

$ cb
* master

这没有提供问题的答案。要批评或要求作者澄清,请在他们的帖子下方留下评论。 - From Review
你为什么这么认为?
您应该为 OP 评论和描述您的帖子,这样会更容易理解您的帖子。
完全有道理。
如果您使用 zsh,则需要将 grep 正则表达式括在单引号中:git branch | grep '^\*'
K
Kirill Zhuravlov

您可以永久设置 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 命令编辑您的 .bashrc(适用于 Ubuntu)并将以下内容添加到顶部:

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

https://i.stack.imgur.com/lczJR.png


D
Diego Pino

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

#!/bin/bash

git branch | grep -e "^*"

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

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

$ git cbr
* master

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


u
user

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

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

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


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