如何在 Git 中获取当前分支的名称?
.git/HEAD
,可能在父目录中
git branch --show-current
。请参阅my answer here。
git branch
应该显示你的仓库的所有本地分支。星号分支是您当前的分支。
要仅检索您所在分支的名称:
git rev-parse --abbrev-ref HEAD
或使用 Git 2.22 及更高版本:
git branch --show-current
git checkout --orphan foo
之后,git branch
未能显示分支 foo
。而建议的 git symbolic-ref HEAD
另一个答案有效。
git rev-parse --abbrev-ref HEAD
究竟做了什么?我以前使用 git describe --contains --all HEAD
但有时会中断,我不太清楚为什么。
您还有 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 日
git rev-parse --abbrev-ref HEAD
会在您处于分离状态时显示 HEAD
。
git symbolic-ref HEAD | sed -e "s/^refs\/heads\///"
,因为它在处于分离状态时会显示类似 HEAD detached at a63917f
的字符串,这与其他答案不同,即不显示任何内容或显示 HEAD。这个很重要。
作为我自己的参考(但它可能对其他人有用),我概述了这个线程中提到的大多数(基本命令行)技术,每个技术都适用于几个用例: 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
只查看一个提交,并从所有指向它(或靠近它)的分支/标签中启发式地选择。像 branch
和 status
这样的 DWIM 命令在定义时使用当前分支,但 all 在所有“分离的 HEAD”情况下都会进行启发式选择。
从 git 的 2.22 版开始,您可以使用:
git branch --show-current
根据手册页:
打印当前分支的名称。在分离 HEAD 状态下,不打印任何内容。
另一种选择:
git name-rev --name-only HEAD
echo ${$(git symbolic-ref --quiet HEAD)#refs/heads/}
检索
git checkout master && git name-rev --name-only HEAD # ac-187
它没有按预期工作
git branch --list
只会说 * (HEAD detached at 7127db5)
。做 git rev-parse --abbrev-ref HEAD
只是说 HEAD
等等。
很简单,我把它放在一个衬里(bash)中
git branch | sed -n '/\* /s///p'
(信用:有限赎罪)
当我在那里时,获得远程跟踪分支的一个班轮(如果有的话)
git rev-parse --symbolic-full-name --abbrev-ref @{u}
sed -n 's/\* //p'
可以解决问题。虽然我倾向于偏执,所以我会用 sed -n 's/^\* //p'
锚定它。
您可以在 Linux 上的存储库目录中输入命令行(控制台):
$ git status
你会看到一些文本,其中类似于:
...
On branch master
...
这意味着您当前在 master
分支上。如果您当时正在编辑任何文件并且它位于同一个本地存储库(包含受 Git 版本控制管理的文件的本地目录),则您正在编辑此分支中的文件。
git status
并使用 git status | head -1
仅获取第一行输出,这会产生类似于 # On branch master
的内容。我确信版本差异也需要考虑在内。
git status | grep 'On branch'
,它应该具有相同的效果(应该,并不意味着如果您的 Git 版本以不同的方式显示它)。或 git branch | grep '*'
,它将显示分支的名称,并在其开头带有星号。
<tick>git status | head -1<tick>.gsub('# On branch ', '')
git status
可能需要很长时间才能返回值。
git status
可能会占用整个页面的生成时间。
git symbolic-ref -q --short HEAD
我在需要当前分支名称的脚本中使用它。它将向您显示当前对 HEAD 的简短符号引用,这将是您当前的分支名称。
在终端中写入以下命令:
git branch | grep \*
或者
git branch --show-current
或者
git branch --show
要在 git 使用中获取当前分支,
git branch --show-current
git branch | grep -e "^*" | cut -d' ' -f 2
将仅显示分支名称
git branch
仅显示当前分支名称。
虽然 git branch 会显示所有分支并用星号突出显示当前分支,但在处理大量分支时它可能太麻烦了。
要仅显示您当前所在的分支,请使用:
git rev-parse --abbrev-ref HEAD
git branch --contains
有时会列出多个分支。
使用好的 ol' awk 找到了一个与 Oliver Refalo's 长度相同的命令行解决方案:
git branch | awk '/^\*/{print $2}'
awk
读作“在匹配正则表达式的行上执行 {}
中的内容”。默认情况下,它假定以空格分隔的字段,因此您打印第二个。如果您可以假设只有您的分支所在的行有 *,您可以删除 ^。啊,猛击高尔夫!
一个噪音较小的 git status 版本可以解决问题
git status -bsuno
它打印出来
## branch-name
为什么不使用 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 describe --contains --all HEAD
,我目前在此页面的其他地方没有看到。我相信您知道,在 StackOverflow 上不建议仅使用链接的答案。
git-prompt.sh
(又名 __git_ps1
)是如何做到的......
抱歉,这是另一个命令行答案,但这就是我发现这个问题时正在寻找的,其中许多答案很有帮助。我的解决方案是以下 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
的参数的东西。
#!/bin/bash
function git.branch {
br=`git branch | grep "*"`
echo ${br/* /}
}
git.branch
您可以在工作目录上使用 git bash 命令如下
git status -b
它会告诉你你在哪个分支上有很多有用的命令,其中一些是
-s
--short 以短格式给出输出。
-b --branch 以短格式显示分支和跟踪信息。
--porcelain[=] 以易于解析的格式为脚本提供输出。这类似于 short 输出,但在 Git 版本之间以及无论用户配置如何都将保持稳定。详情见下文。
version 参数用于指定格式版本。这是可选的,默认为原始版本 v1 格式。
--long 以长格式给出输出。这是默认设置。
-v --verbose 除了已更改文件的名称外,还显示暂存待提交的文本更改(即,如 git diff --cached 的输出)。如果 -v 指定了两次,则还显示工作树中尚未暂存的更改(即,如 git diff 的输出)。
随着时间的推移,我们可能会有很长的分支列表。
虽然其他一些解决方案很棒,但这是我所做的(从 Jacob 的回答中简化):
git branch | grep \*
现在,
git status
有效,但仅当有任何本地更改时
git status
还将给出分支名称以及更改。
例如
>git status
On branch master // <-- branch name here
.....
我会尝试以下方法之一:
1.> git symbolic-ref --short HEAD
git symbolic-ref --short HEAD
>>> sid-dev
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 是我的分支的名称。
有多种方法可以检查 Git
的当前分支,但我更喜欢:
git branch --show
甚至 git branch
也显示当前分支名称以及所有现有分支名称列表。
我建议使用这两个命令中的任何一个。
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
在 Netbeans 中,确保启用了版本控制注释(查看 -> 显示版本控制标签)。然后您可以在项目名称旁边看到分支名称。
http://netbeans.org/bugzilla/show_bug.cgi?id=213582
那这个呢?
{ git symbolic-ref HEAD 2> /dev/null || git rev-parse --short HEAD 2> /dev/null } | sed "s#refs/heads/##"
symbolic-ref
部分是否也需要 --short
以避免在分支名称前加上 refs/heads/
前缀?
以下 shell 命令告诉您当前所在的分支。
git branch | grep ^\*
如果您不想在每次想知道分支并且使用 Bash 时都键入那个长命令,请给命令一个短别名,例如 alias cb
,就像这样。
alias cb='git branch | grep ^\*'
当您在分支 master 中并且您的提示符为 $
时,您将获得 * master
,如下所示。
$ cb
* master
git branch | grep '^\*'
您可以永久设置 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
我有一个名为 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
的脚本等。
在分离头上返回分支名称或 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
不定期副业成功案例分享
git branch
显示* (no branch)
,这也是无用的......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
。