【问题标题】:Show just the current branch in Git仅显示 Git 中的当前分支
【发布时间】:2010-11-27 22:13:09
【问题描述】:

我试图为此寻找一个特殊的 Git 命令,但我找不到。有什么比以下更短或更快的吗?

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

【问题讨论】:

  • 我认为这是获取当前分支的最快方法
  • @ChandrayyaGK:不,因为另一个问题是关于在您的 IDE 中执行此操作。 (许多答案都是针对命令行使用的,所以值得一看,但它不是正确的副本,如果有任何答案可以为已经存在的内容增加重要价值,那么这些答案可能应该在这里迁移。)
  • @Torek - 这是另一个被 Git 弄得很困难的简单任务。
  • @ChandrayyaGK 发布的链接的最佳答案比这慢得多!

标签: git branch git-branch


【解决方案1】:

使用 Git 2.22(2019 年第二季度),您将有一个更简单的方法:git branch --show-current

参见Daniels Umanovskis (umanovskis)commit 0ecb1fc(2018 年 10 月 25 日)。
(由 Junio C Hamano -- gitster -- 合并于 commit 3710f60,2019 年 3 月 7 日)

branch:介绍--show-current显示选项

当使用--show-current 调用时,git branch 将打印当前 分支名称并终止。
仅打印实际名称,不打印refs/heads
在分离的 HEAD 状态下,没有任何输出。

同时用于脚本和交互式/信息性用途。
git branch --list 不同,无需过滤即可获得 分支名称。

请参阅Git mailing list in Oct. 2018actual patch 上的原始讨论。


警告:如in the comments Olivier 所述:

这并不适用于所有情况!
例如,当您在 子模块 中时,它不起作用。
'git symbolic-ref --short HEAD' 总是有效的。

【讨论】:

  • 最后,似乎从一开始就应该存在的东西,已经被添加了!
  • 警告,这并不适用于所有情况!例如,当您在子模块中时,它不会 起作用。 'git symbolic-ref --short HEAD' 总是有效
  • @Olivier 好点,谢谢 beaucoup。我已将您的评论包含在答案中以提高知名度。
  • @crypdick 这是可能的,但是你的,呃……当前的 git 版本是什么?
  • @VonC 好问题,但我已经修复了一个解决方案并关闭了集群¯_(ツ)_/¯
【解决方案2】:

对于喜欢别名的人: 将以下内容放入您的 .zshrc 中,以便您获得更轻松的 git 命令流程:

alias gpsu="git push --set-upstream origin $(git symbolic-ref --short HEAD)"

【讨论】:

  • 正是我想要的。美丽
【解决方案3】:

据我所知,没有办法在 Git 中仅显示当前分支,所以我一直在使用:

git branch | grep '*'

【讨论】:

  • 虽然它适用于 GNU coreutils,但grep '*' 名义上是一个语法错误。无论如何,您可能想要git branch | sed -n 's/^\* //p'。或者实际上,OP 首先发布的内容是一样的。
  • @tripleee 你能告诉我为什么grep '*' 名义上是一个语法错误吗?
  • @JKABC:@tripleee 的意思是 '*' 是一个正则表达式,因此它是无效的。您可能想要使用 '[*]'(即字符 * 而不是运算符“零次或多次”)。
  • @johndodo 谢谢你的澄清,现在对我来说很有意义。我通常通过grep '\*'
  • 只能剪切带有git branch | grep "*" | cut -d' ' -f2的分支名称
【解决方案4】:

有人可能会觉得这 (git show-branch--current) 很有帮助。当前分支以 * 标记显示。

host-78-65-229-191:idp-mobileid user-1$ git show-branch --current
! [CICD-1283-pipeline-in-shared-libraries] feat(CICD-1283): Use latest version of custom release plugin.
 * [master] Merge pull request #12 in CORES/idp-mobileid from feature/fix-schema-name to master
--
+  [CICD-1283-pipeline-in-shared-libraries] feat(CICD-1283): Use latest version of custom release plugin.
+  [CICD-1283-pipeline-in-shared-libraries^] feat(CICD-1283): Used the renamed AWS pipeline.
+  [CICD-1283-pipeline-in-shared-libraries~2] feat(CICD-1283): Point to feature branches of shared libraries.
-- [master] Merge pull request #12 in CORES/idp-mobileid from feature/fix-schema-name to master

【讨论】:

  • git branch --show-currentgit version 2.24.3 (Apple Git-128) 上为我工作
【解决方案5】:

为了完整起见,至少在 Linux 上,echo $(__git_ps1) 应该给您当前分支的名称,并用括号括起来。

这在某些情况下可能很有用,因为它不是 Git 命令(取决于 Git),尤其是用于设置 Bash 命令提示符以显示当前分支

例如:

/mnt/c/git/ConsoleApp1 (test-branch)> echo $(__git_ps1)
(test-branch)
/mnt/c/git/ConsoleApp1 (test-branch)> git checkout master
Switched to branch 'master'
/mnt/c/git/ConsoleApp1 (master)> echo $(__git_ps1)
(master)
/mnt/c/git/ConsoleApp1 (master)> cd ..
/mnt/c/git> echo $(__git_ps1)

/mnt/c/git>

【讨论】:

  • 该项目是一个别名,应该存在于交互式 shell 脚本中。对于任何类型的脚本,它都可能不存在。
【解决方案6】:

我想这应该很快并且可以与 Python API 一起使用:

git branch --contains HEAD
* master

【讨论】:

  • 这不会输出当前分支。它输出恰好指向提交 HEAD 指向的分支列表。是的,它可以重叠,但这可能会导致误解。从您所在的位置创建一个新分支并重试您的行:两个分支。问题要求“只是当前分支”。
【解决方案7】:

我正在使用

/etc/bash_completion.d/git

它与 Git 一起提供,并提供分支名称和参数完成提示。

【讨论】:

  • 如何激活这个提示?
  • 在 ubuntu 中,$ source /etc//bash_completion.d/git-prompt 文件在不同系统上的命名可能不同。 (注意:source 关键字与 bash 中的 .(点)相同。)
【解决方案8】:

这不是更短,但它也处理分离的分支:

git branch | awk -v FS=' ' '/\*/{print $NF}' | sed 's|[()]||g'

【讨论】:

    【解决方案9】:

    在 Git 1.8.1 中,您可以使用带有“--short”选项的 git symbolic-ref 命令:

    $ git symbolic-ref HEAD
    refs/heads/develop
    $ git symbolic-ref --short HEAD
    develop
    

    【讨论】:

    • 比 IMO 接受的答案更好,因为它适用于没有提交的 repos
    • 在作为 TravisCI 构建的一部分运行时收到错误 fatal: ref HEAD is not a symbolic ref
    • 似乎在 GIT 1.9.1 ``` git 版本 1.9.1 中不起作用 致命:ref HEAD 不是符号 ref ``
    • 为我工作:git 版本 2.16.2.windows.1
    • 对于那些得到“符号引用”错误的人:这可能是因为您在技术上没有签出分支,并且处于“分离”状态:stackoverflow.com/questions/10228760/fix-a-git-detached-head。因此,如果您需要该命令在分离头状态下成功退出,请在另一个答案中使用“rev-parse”命令
    【解决方案10】:

    你可能对

    的输出感兴趣
    git symbolic-ref HEAD
    

    特别是,根据您的需要和您可能希望做的布局

    basename $(git symbolic-ref HEAD)
    

    git symbolic-ref HEAD | cut -d/ -f3-
    

    然后还有 .git/HEAD 文件,您可能也会感兴趣。

    【讨论】:

    • 您可以将git rev-parse --symbolic-full-name 缩短为git symbolic-ref
    • 你不需要使用basenamecut;使用 BR=${BR#refs/heads/}(其中 BR 是您保存的 git symbolic-ref HEAD 输出的变量名称)。
    • Jakub,当然不是,只要你有变量的输出。
    • 可以git symbolic-ref --short HEAD也可以
    • 如果您的分支名称中有斜杠(“task/foo”、“feature/bar”),这将中断。当同事们认为斜线很酷时,我的一堆构建脚本开始失败......
    【解决方案11】:
    $ git rev-parse --abbrev-ref HEAD
    master
    

    这应该适用于 Git 1.6.3 或更高版本。

    【讨论】:

    • 对我也不起作用,使用 git-1.6.2.5。 git rev-parse --abbrev-ref HEAD => --abbrev-ref 311172491a9a667f9321bdf1c4fe5e22cc6e2c08 (即 rev-parse 不接受 --abbrev-ref (不在手册页中))
    • JasonWoof,在 1.6.4.2 中为我工作,需要更改日志以查看它究竟是什么时候发生的 ;-)
    • 据我从 Git 日志中得知,此功能于 2009 年 4 月 20 日合并,并与 1.6.3 版本一起发布。
    • 我也很想明白这一点。这实际上是如何工作的?此外,看起来 --abbrev-ref 没有为任何其他参数返回任何内容。它不可能只是将 HEAD 作为参数。
    • 请注意,如果你在一个分离的符号引用中(可能意味着你在一个分支中,但检查了之前的提交),这个命令将只返回HEAD,而不是预期master
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-04-27
    • 2018-05-31
    • 2020-03-19
    • 2017-07-31
    • 1970-01-01
    • 2013-07-10
    相关资源
    最近更新 更多