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

mik*_*628 2321 git branch git-branch

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

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

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

Jis*_*iot 4536

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

git rev-parse --abbrev-ref HEAD
Run Code Online (Sandbox Code Playgroud)

参考:

  • @ChrisNelson,因为它只显示当前分支,而不是所有分支的长列表. (130认同)
  • "git symbolic-ref --short HEAD"也适用于同一目的 (75认同)
  • 好的,遗憾的是,如果你处于'超级头部'状态(它只输出'HEAD',这完全没用),它就不起作用. (69认同)
  • 我想通过git内部,如果你处于'超级HEAD'状态,就没有跟踪它所属的分支,因为`git branch`显示`*(无分支)`,这也是无用的...... (32认同)
  • `git rev-parse --abbrev-ref HEAD 2>/dev/null`如果你刚刚创建了一个还没有HEAD的新存储库,/ dev/null部分会阻止你看到错误. (22认同)
  • `git symbolic-ref --short HEAD`似乎更加通用.如果repo是刚刚初始化的,那么`git rev-parse --abbrev-ref HEAD`会产生`HEAD`. (9认同)
  • 注意:`git symbolic-ref --short HEAD`在1.8之前的客户端不起作用.(RHEL6目前在v1.7) (6认同)
  • @ mike628请考虑接受这个作为解决方案. (5认同)
  • 它的所有打印都是`HEAD`?我在Windows上,msysgit. (4认同)
  • 为什么不直接使用 `gitbranch --show-current` 呢?我想现在几乎每个人都在使用 v2.2+... (4认同)
  • 这比`git branch`更好.我不需要解析结果来获取当前分支. (3认同)
  • 在我的机器上,我得到两行,第二行用` - `文本填充.不应该从答案中删除` - `吗? (3认同)
  • 与@CoDEmanX 相同。这会打印“HEAD”。使用 git 版本“1.8.1.msysgit.1”,W7。 (2认同)
  • 更新:@CoDEmanX我运行了`git branch`它显示了两个分支:`<no branch>`(???)和`master`.显然我是前者.切换到`master`并确保我在分支而不是分支后,这开始工作.后来更新:现在我记得了!我正在使用一个独立的头:)所以没有分支:) (2认同)
  • 这只为我显示SHA哈希值 (2认同)
  • 使用Unix工具的另一种方法:`git branch | grep \ * | awk'{print $ 2}'` (2认同)
  • @nilesh:该命令将包含一个星号。这个答案给出了确切的分支名称(对于脚本编写很有用)。 (2认同)
  • 喜欢这个解决方案的完全不直观和神秘。它非常适合我,但也很好地说明了我多年来对 Git 及其文档的不满。 (2认同)

rob*_*dev 1886

git branch
Run Code Online (Sandbox Code Playgroud)

应该显示您的回购的所有本地分支.已加星标的分支是您当前的分支.

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

git rev-parse --abbrev-ref HEAD
Run Code Online (Sandbox Code Playgroud)

  • 顺便说一句:`git rev-parse --abbrev-ref HEAD`(如下所述)没有任何进一步的工作,并返回当前的分支名称,不带`sed`或`grep` (265认同)
  • `git branch | grep\*| 切-d'' - f2`分裂在星空后的空间,仅返回名称.根据@fboes的评论 (136认同)
  • `git branch | grep\*`只返回当前分支(但仍然在它前面有一个星号) (41认同)
  • `git branch | grep\*| cut -d'' - f2-` - 我建议对@jgraup的注释进行小改动(用`-f2 -`替换`-f2`)以获得第一个空格后的所有内容,因为在`*(HEAD在ff3de3c处分离)的情况下)`你得到`(HEAD`只 (27认同)
  • 请不要只发布一系列命令行指令.实际上解释每个步骤正在做什么. (4认同)
  • 但这对我使用 Notepad++ 和 Netbeans 没有帮助。只是 git bash (和 Probobly Vim),我提到过这一点。我正在尝试使用其他非命令行的 Ide 和文本编辑器。 (2认同)
  • 如果您愿意在Eclipse中工作,那么有一个名为"eGit"的程序,它有一个GUI,可以告诉您当前所有repos的分支.否则,我不知道..你会受到你想要使用的任何插件的创建者的支配,这与你选择的程序兼容(如果有的话). (2认同)
  • 在执行`git checkout --orphan foo`之后,`git branch`无法显示分支`foo`.鉴于`git symbolic-ref HEAD`,建议另一个答案奏效. (2认同)
  • downvote,我们只希望当前分支为stdout,而不是所有分支 (2认同)
  • `git rev-parse --abbrev-ref HEAD` 到底是做什么的?我以前使用过“git describe --contains --all HEAD”,但有时会中断,我不太清楚为什么。 (2认同)

Wer*_*ght 503

您还git symbolic-ref HEAD可以显示完整的refspec.

仅在Git v1.8及更高版本中显示分支名称(感谢Greg指出这一点):

$ git symbolic-ref --short HEAD
Run Code Online (Sandbox Code Playgroud)

在Git v1.7 +上你也可以这样做:

$ git rev-parse --abbrev-ref HEAD
Run Code Online (Sandbox Code Playgroud)

如果你在一个分支上,两者都应该给出相同的分支名称.如果你是一个独立的头,答案不同.

注意:

在早期的客户端,这似乎工作:

$ git symbolic-ref HEAD | sed -e "s/^refs\/heads\///"
Run Code Online (Sandbox Code Playgroud)

- Darien 26. 2014年3月

  • @CarlosCampderrós:如果你处于分离的HEAD状态,那么就没有当前的分支.毕竟,您所在的提交可以通过零,一个或多个分支到达. (46认同)
  • 与所有其他答案一样,当您处于"分离的HEAD"状态时,这不起作用 (7认同)
  • 使用git版本2.4.4`git rev-parse --abbrev-ref HEAD`当你处于分离头时显示`HEAD`. (7认同)
  • 当没有HEAD时,这会在空的git存储库中产生问题 (2认同)

Ste*_*aan 242

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

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

结果:

  • git branch | sed -n '/\* /s///p'
    • 当地分公司: master
    • 远程跟踪分支(同步): (detached from origin/master)
    • 远程跟踪分支(不同步): (detached from origin/feature-foo)
    • 标签: (detached from v1.2.3)
    • 子模块:`(HEAD分离于285f294)
    • 一般分离头: (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
    • 子模块: # 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
    • 子模块: v1.2.3
    • 一般分离头: remotes/origin/HEAD
  • v1.0.6-5-g2393761:
    • 当地分公司: cat .git/HEAD
    • 子模块: ref: refs/heads/master
    • 所有其他用例:相应提交的SHA
  • cat: .git/HEAD: Not a directory
    • 当地分公司: git rev-parse --abbrev-ref HEAD
    • 所有其他用例: master
  • HEAD
    • 当地分公司: git symbolic-ref --short HEAD
    • 所有其他用例: master

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

  • 总而言之,似乎没有人能够完成我手边的工作. (5认同)
  • 这对我很有帮助:`git describe --all --exact-match 2>/dev/null | sed's =.*/=='`对我来说是最好的解决方案(标签和分支头的好名称,随机分离头没有输出. (5认同)
  • 这对我真的不止一次很有帮助,谢谢你这么彻底! (2认同)
  • “当前分支”(由 `checkout foo` 设置)和“当前提交”是两个不同的概念。`symbolic-ref` 只查看活动分支。`describe` 只查看_a commit_,并从指向它(或靠近它)的所有分支/标签中“启发式选择”。像“branch”和“status”这样的 DWIM 命令在定义时使用当前分支,但*所有*它们在所有“分离 HEAD”情况下都会进行启发式选择。 (2认同)

Fil*_*nov 132

还有一个选择:

git name-rev --name-only HEAD
Run Code Online (Sandbox Code Playgroud)

  • 如果HEAD与主分支和功能分支相同(例如在合并期间),则它不起作用.即使在功能分支上执行,它也会返回'master'. (12认同)
  • 我是从Jenkins管道做的.所以这对我来说似乎是最好的答案.做`git branch --list`只是说'*(HEAD脱离7127db5)`.做`git rev-parse --abbrev-ref HEAD`只是说`HEAD`等等. (4认同)

Max*_*Max 99

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

git branch --show-current
Run Code Online (Sandbox Code Playgroud)

  • 至少要提一下,这在分离的 HEAD 状态下**不起作用**。只是浪费了几个小时让 git 2.22 编译无用...... (7认同)
  • 这应该是公认的答案。 (3认同)
  • 是的,我去年三月在该页面的评论中提到:/sf/ask/437189931/#comment96922502_6245570。并在/sf/answers/3856220581/中。 (2认同)
  • @DavidDeprost 但它正在工作。当处于超然的头部状态时,你并不在树枝上。因此,什么都不显示是对此的一个非常合理的回应。您预计会发生什么? (2认同)

Oli*_*alo 91

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

git branch | sed -n '/\* /s///p'
Run Code Online (Sandbox Code Playgroud)

(信用:有限赎罪)

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

git rev-parse --symbolic-full-name --abbrev-ref @{u}
Run Code Online (Sandbox Code Playgroud)

  • 太多的斜线!:)`sed -n's /\*// p'`就可以了.虽然我倾向于偏执狂,所以我会用`sed -n's/^\*// p'来锚定它. (8认同)

vid*_*unj 91

在终端中写入以下命令:

git branch | grep \*
Run Code Online (Sandbox Code Playgroud)

或者

git branch --show-current 
Run Code Online (Sandbox Code Playgroud)

或者在 Git 2.22 及更高版本上:

  git branch --show
Run Code Online (Sandbox Code Playgroud)


Tad*_*eck 61

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

$ git status
Run Code Online (Sandbox Code Playgroud)

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

...
On branch master
...
Run Code Online (Sandbox Code Playgroud)

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

  • 如果管理大量文件,`git status` 可能需要很长时间才能返回值。 (3认同)
  • 根据你想做什么,你可以使用 `git status` 并使用 `git status | 只获取第一行输出。head -1` 产生类似于 `# On branch master` 的结果。我确信版本差异也需要考虑在内。 (2认同)

Ros*_*ose 39

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

git branch --show-current
Run Code Online (Sandbox Code Playgroud)

  • 你好@sych 抱歉——这个命令中的破折号有什么问题吗?这在我的机器上复制粘贴效果很好(Linux,薄荷味,git 版本 2.25.1) (2认同)

Kou*_*sha 35

git symbolic-ref -q --short HEAD
Run Code Online (Sandbox Code Playgroud)

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


ung*_*rys 26

git branch | grep -e "^*" | cut -d' ' -f 2
Run Code Online (Sandbox Code Playgroud)

将仅显示分支名称


小智 25

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

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

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

git rev-parse --abbrev-ref HEAD
Run Code Online (Sandbox Code Playgroud)

  • `git branch --contains`也适用 (5认同)

Sil*_*rta 22

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

git branch | awk '/^\*/{print $2}'
Run Code Online (Sandbox Code Playgroud)

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


Sid*_*thy 20

我会尝试以下其中一项:

\n

1.> git symbolic-ref --短头

\n
git symbolic-ref --short HEAD\n>>> sid-dev\n
Run Code Online (Sandbox Code Playgroud)\n

2.> git 分支 --show-current

\n
git branch --show-current\n>>> sid-dev\n
Run Code Online (Sandbox Code Playgroud)\n

3.> git name-rev \xe2\x80\x93name-only HEAD

\n
git name-rev \xe2\x80\x93name-only HEAD\n>>> HEAD sid-dev\n
Run Code Online (Sandbox Code Playgroud)\n

笔记:

\n
\n

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

\n
\n
\n

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

\n
\n
\n

3.> git name-rev \xe2\x80\x93name-only HEADHEAD给出当前分支修订的符号名称

\n
\n
\n

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

\n
\n


小智 20

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

git branch --show
Run Code Online (Sandbox Code Playgroud)

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


Jak*_*ski 18

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


如何git-prompt.shcontrib/做它(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: 'prefix 开头,那么.git/HEAD是symref(符号引用),我们在正常分支上.剥去此前缀以获取全名,并剥离refs/heads/以获取当前分支的简称:

      b="${head#ref: }"
      # ...
      b=${b##refs/heads/}
      
      Run Code Online (Sandbox Code Playgroud)
    • 如果它不是以它开头'ref: ',则它是分离的HEAD(匿名分支),直接指向某个提交.用于git describe ...以人类可读的形式编写当前提交.

我希望有所帮助.

  • 这个记录似乎正在做`git describe --contains --all HEAD`,我目前在本页的其他地方没有看到.我相信您知道,不建议在StackOverflow上使用仅链接答案. (4认同)
  • 如果你正在开发一个git-aware shell提示符,你应该使用哪些答案?海龟一路下来. (3认同)
  • @tripleee:我已经添加了一个解释`git-prompt.sh`(又名`__git_ps1`)如何做到这一点...... (2认同)

Dzi*_*mid 18

#!/bin/bash
function git.branch {
  br=`git branch | grep "*"`
  echo ${br/* /}
}
git.branch
Run Code Online (Sandbox Code Playgroud)


dgo*_*vin 16

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

git status -bsuno
Run Code Online (Sandbox Code Playgroud)

打印出来

## branch-name
Run Code Online (Sandbox Code Playgroud)

  • ## 开发...起源/开发 (2认同)

dma*_*o12 15

对不起,这是另一个命令行答案,但是当我发现这个问题并且其中许多答案都有帮助时,这就是我所寻找的.我的解决方案是以下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
}
Run Code Online (Sandbox Code Playgroud)

这应该总是给我一些人类可读和可直接用作参数的东西git checkout.

  • 在当地分行: feature/HS-0001
  • 在标记的提交(分离): v3.29.5
  • 在远程分支上(分离,未标记):SHA1
  • 在任何其他分离提交:SHA1


小智 15

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

git status -b
Run Code Online (Sandbox Code Playgroud)

它会告诉你你在哪个分支上有许多有用的命令

-s
Run Code Online (Sandbox Code Playgroud)

--short以短格式提供输出.

-b --branch即使是短格式显示分支和跟踪信息.

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

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

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

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


kar*_*ikr 13

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

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

git branch | grep \*
Run Code Online (Sandbox Code Playgroud)

现在,

git status
Run Code Online (Sandbox Code Playgroud)

有效,但仅限于有任何本地更改


jac*_*nye 13

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

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


小智 12

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

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


小智 12

那这个呢?

{ git symbolic-ref HEAD 2> /dev/null || git rev-parse --short HEAD 2> /dev/null } | sed "s#refs/heads/##"
Run Code Online (Sandbox Code Playgroud)

  • 好像你应该使用()而不是{}来包装git命令 (2认同)

Sat*_*mar 12

git status 
Run Code Online (Sandbox Code Playgroud)

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

例如

>git status
On branch master // <-- branch name here
.....
Run Code Online (Sandbox Code Playgroud)


Die*_*ino 11

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

#!/bin/bash

git branch | grep -e "^*"
Run Code Online (Sandbox Code Playgroud)

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

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

$ git cbr
* master
Run Code Online (Sandbox Code Playgroud)

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


Kir*_*lov 10

您可以永久设置bash输出以显示您的git-branch名称.当您使用不同的分支时,它非常方便,无需一直打字$ git status.Github repo git-aware-prompt .

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

mkdir ~/.bash
cd ~/.bash
git clone git://github.com/jimeh/git-aware-prompt.git
Run Code Online (Sandbox Code Playgroud)

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

export GITAWAREPROMPT=~/.bash/git-aware-prompt
source "${GITAWAREPROMPT}/main.sh"
Run Code Online (Sandbox Code Playgroud)

然后粘贴代码

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\]\$ "
Run Code Online (Sandbox Code Playgroud)

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


mrr*_*sof 10

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

git branch | grep ^\*
Run Code Online (Sandbox Code Playgroud)

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

alias cb='git branch | grep ^\*'
Run Code Online (Sandbox Code Playgroud)

如果您在分支机构中,并且您的提示是$,您将得到* master如下结果.

$ cb
* master
Run Code Online (Sandbox Code Playgroud)


use*_*ser 9

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

git rev-parse --abbrev-ref HEAD | grep -v ^HEAD$ || git rev-parse HEAD
Run Code Online (Sandbox Code Playgroud)

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

  • 更好:`git symbolic-ref --quiet --short HEAD || git rev-parse --short HEAD` (7认同)

Sha*_*eel 9

一个简单的黑客可能是

git branch|grep "*"
Run Code Online (Sandbox Code Playgroud)

输出:

* <current branch>
Run Code Online (Sandbox Code Playgroud)

编辑:

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

git status|head -1
On branch <current branch name>
Run Code Online (Sandbox Code Playgroud)


Rya*_*yan 8

如果你真的想要在分离的HEAD状态下检出最后一个分支/标签.

git reflog HEAD | grep 'checkout:' | head -1 | rev | cut -d' ' -f1 | rev
Run Code Online (Sandbox Code Playgroud)

更新 如果您有并且不害怕awk,那就更好了.

git reflog HEAD | grep 'checkout:' | head -1 | awk '{print $NF}'
Run Code Online (Sandbox Code Playgroud)

  • 进一步缩短为`git reflog | awk '$3=="checkout:" {print $NF; 退出}'` (2认同)

ski*_*ppy 6

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

git status | sed -n 1p
Run Code Online (Sandbox Code Playgroud)

说明:

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

对上述命令的响应如下:

"On branch your_branch_name"
Run Code Online (Sandbox Code Playgroud)

  • `head -1`是通常的方式 (2认同)

小智 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-提交人/作者的电子邮件


Abd*_*UMI 5

将其添加到PS1使用Mac:

PS1='\W@\u >`[ -d .git ] && git branch | grep  ^*|cut -d" " -f2`> $ '
Run Code Online (Sandbox Code Playgroud)

在运行上面的命令之前:

在此处输入图片说明

运行该命令后:

在此处输入图片说明

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


gli*_*isu 5

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


eha*_*ght 5

我想要一行可以在 Windows CMD shell 中解析的行(这里的大多数答案都使用 unix 命令)。大多数答案还存在结帐稀疏和头部分离的问题。

git branch
Run Code Online (Sandbox Code Playgroud)

给出工作副本中可用的分支列表,在签出的分支前面有一个 *。这有利于快速查看,但不利于解析。

git rev-parse --abbrev-ref HEAD
Run Code Online (Sandbox Code Playgroud)

当在分离的 HEAD 结账上使用它时,只是将HEAD显示为分支。同样,当使用

git symbolic-ref HEAD
Run Code Online (Sandbox Code Playgroud)

我遇到了致命的问题:当使用来自标签的分离头时,ref HEAD 不是符号引用。

git describe --contains --all HEAD
Run Code Online (Sandbox Code Playgroud)

似乎在大多数情况下都有效,并且接近我想要的,但有些存储库只是返回了一个空行。

git status
Run Code Online (Sandbox Code Playgroud)

有效,但它列出了存储库中的所有差异,这使得解析有点困难。

我最终决定了以下几点;

git status |findstr/n ^^|findstr "^[1]: ^[0]:"
Run Code Online (Sandbox Code Playgroud)

这给出如下输出;

1:HEAD于2020年2月30日分离

或者

1:在分支主控上