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


当前回答

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

本地分支(主分支)远程跟踪分支,与本地分支同步(源/主与主提交相同)远程跟踪分支,与本地分支不同步(原点/功能foo)标签(v1.2.3)子模块(在子模块目录中运行)一般分离头(以上均不适用)

结果:

git分支|sed-n'/\*/s///p'本地分支:主远程跟踪分支(同步):(与源/主分离)远程跟踪分支(不同步):(与原始/功能foo分离)标签:(与v1.2.3分离)子模块:(头部在285f294处分离)通用分离头:(与285f294分离)git状态|头-1本地分支:#在分支主机上远程跟踪分支(同步):#HEAD在源站/主站分离远程跟踪分支(不同步):#HEAD在origin/feature foo分离tag:#HEAD在v1.2.3中分离子模块:#HEAD在285f294处分离一般分离封头:#在285f294处分离封头git-descripte--全部本地分支:主管/主管远程跟踪分支(同步):头/主(注意:不是远程/原点/主)远程跟踪分支(不同步):remotes/origin/feature foo标签:v1.2.3子模块:remotes/origin/HEAD通用分离头:v1.0.6-5-g2393761cat.git/HEAD:本地分支:ref:refs/heads/master子模块:cat:.git/HEAD:不是目录所有其他用例:相应提交的SHAgit-rev-parse--缩写ref HEAD本地分支:主所有其他用例:HEADgit符号ref—短HEAD本地分支:主所有其他用例:fatal:ref HEAD不是符号ref

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

其他回答

要仅显示当前分支的名称,请执行以下操作:

git rev-parse --abbrev-ref HEAD

参考:仅显示Git中的当前分支

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

$ git status

您将看到一些文本,其中类似于:

...
On branch master
...

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

我一直在与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容器上标记的工作:当头部分离时,它将获得远程分支名称。

注意事项:

只要标记的提交只出现在一个分支上,这就可以正常工作。因此,如果您通常合并到dev,并从那里通过转移到生产,那么来自dev的原始提交将出现在所有三个分支上,从而破坏代码。但只要您只标记合并/PR提交这需要预先运行git fetch-a,因为CI只会检出默认的分支和标记的提交,所以如果正确的分支都不是,它将无法工作

更多解释:

我想获得分支名称,即使CI构建是由标记触发的。在这种情况下,没有设置CircleCI pipeline.git.branch变量,也无法在头部分离时从git中轻松获取分支名称(正如许多其他问题中所指出的)。这意味着grepping当前分支(使用*前缀)也不能像在CI上那样工作,当前分支将是分离的头部分支。其想法是获取包含此提交的所有分支(包括远程分支);然后删除分离的head结果,去掉所有不是实际分支名称的位并消除重复

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

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

随着时间的推移,我们可能会有一长串分支。

虽然其他一些解决方案很好,但以下是我所做的(从雅各布的回答中简化):

git branch | grep \*

Now,

git status

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