我来自Subversion的背景,当我有一个分支时,我知道我正在使用“这些工作文件指向此分支”进行操作。
但是,使用Git时,我不确定在NetBeans或Notepad ++中编辑文件时,是将文件绑定到主文件还是其他分支。
git
bash 没问题,它告诉我我在做什么。
我来自Subversion的背景,当我有一个分支时,我知道我正在使用“这些工作文件指向此分支”进行操作。
但是,使用Git时,我不确定在NetBeans或Notepad ++中编辑文件时,是将文件绑定到主文件还是其他分支。
git
bash 没问题,它告诉我我在做什么。
Answers:
git branch
应该显示您的仓库的所有本地分支。已加星号的分支是您当前的分支。
如果只想检索所在分支的名称,则可以执行以下操作:
git rev-parse --abbrev-ref HEAD
git checkout --orphan foo
然后git branch
失败显示分支foo
。鉴于git symbolic-ref HEAD
建议另一个答案起作用。
git branch
shows * (no branch)
,它也没有用处……
git rev-parse --abbrev-ref HEAD 2>/dev/null
/ dev / null部分可防止您看到错误,如果您刚刚创建了尚未包含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\///"
– 达里安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(指向):
结果:
git branch | sed -n '/\* /s///p'
master
(detached from origin/master)
(detached from origin/feature-foo)
(detached from v1.2.3)
(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
cat: .git/HEAD: Not a directory
git rev-parse --abbrev-ref HEAD
master
HEAD
git symbolic-ref --short HEAD
master
fatal: ref HEAD is not a symbolic 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
确保文件名没有令人讨厌的终端转义码。
从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 branch | grep -e "^*" | cut -d' ' -f 2
将仅显示分支名称
git branch
仅显示当前分支名称。
虽然git branch将显示所有分支并用星号突出显示当前分支,但在使用许多分支时可能会很麻烦。
要仅显示您当前所在的分支,请使用:
git rev-parse --abbrev-ref HEAD
git branch --contains
有时会列出多个分支。
找到了与Oliver Refalo一样长的命令行解决方案,使用了很好的awk:
git branch | awk '/^\*/{print $2}'
awk
读取为“在{}
与正则表达式匹配的行中填充内容”。默认情况下,它采用空格分隔的字段,因此您打印第二个。如果可以假定只有分支所在的行带有*,则可以删除^。啊,打高尔夫球!
为什么不使用git-aware shell提示,它会告诉您当前分支的名称? git status
也有帮助。
如何git-prompt.sh从contrib/
做它(GIT版本2.3.0)中定义的__git_ps1
辅助函数:
首先,在特殊情况下,如果检测到正在进行重新设置基准。Git在改基过程中使用未命名的分支(分离的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/}
如果它不是以开头'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
git checkout
。
您可以在工作目录命令上使用git bash如下
git status -b
它会告诉您所在的分支上有很多有用的命令,其中一些是
-s
--short以短格式给出输出。
-b --branch即使以短格式显示分支和跟踪信息。
--porcelain [=]以易于解析的格式为脚本提供输出。这类似于简短的输出,但是无论用户配置如何,在所有Git版本中都将保持稳定。有关详情,请参见下文。
version参数用于指定格式版本。这是可选的,默认为原始版本v1格式。
--long以长格式给出输出。这是默认值。
-v --verbose除了已更改文件的名称外,还显示已暂存的文本更改(即,例如git diff --cached的输出)。如果两次指定-v,那么还将显示尚未上演的工作树中的更改(即,类似于git diff的输出)。
git status
还将给出分支名称以及更改。
例如
>git status
On branch master // <-- branch name here
.....
我建议使用这两个命令中的任何一个。
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中,确保启用了版本注释(查看->显示版本标签)。然后,您可以在项目名称旁边看到分支名称。
那这个呢?
{ git symbolic-ref HEAD 2> /dev/null || git rev-parse --short HEAD 2> /dev/null } | sed "s#refs/heads/##"
symbolic-ref
部分是否还需要--short
避免在分支名称前添加前缀refs/heads/
?
您可以永久设置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
命令(对于Ubuntu)编辑.bashrc,并将以下内容添加到顶部:
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\]\$ "
以下shell命令告诉您当前所在的分支。
git branch | grep ^\*
当您不想每次都想知道分支并且要使用Bash时都键入该长命令时,请为该命令提供一个简短的别名,例如alias cb
,就像这样。
alias cb='git branch | grep ^\*'
当您在分支母版中并且提示是时$
,将获得* master
以下信息。
$ cb
* master
git branch | grep '^\*'
如果您确实希望以分离的HEAD状态签出最后一个分支/标记。
git reflog HEAD | grep 'checkout:' | head -1 | rev | cut -d' ' -f1 | rev
更新 如果您有并且不害怕awk,这会更好。
git reflog HEAD | grep 'checkout:' | head -1 | awk '{print $NF}'
rev | cut -d' ' -f1| rev
可以与简化awk '{print $NF}'
checkout: moving from ba7571b7fc5b8f31b8d0625821269afaa655577e to f68be8cf7bea917a5a0562b619e50368de0068a9
它仍然是有用的技巧,可能有助于消除某些情况的歧义。
git reflog | awk '$3=="checkout:" {print $NF; exit}'
我知道这很晚,但是在linux / mac上,可以从终端使用以下命令。
git status | sed -n 1p
说明:
git status->获取工作树状态
sed -n 1p->获取状态正文的第一行
对以上命令的响应如下所示:
"On branch your_branch_name"
head -1
将以通常的方式
您还可以使用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-提交人/作者的电子邮件
将其添加到PS1
使用Mac:
PS1='\W@\u >`[ -d .git ] && git branch | grep ^*|cut -d" " -f2`> $ '
在运行上面的命令之前:
运行该命令后:
不用担心,如果它不是GIT存储库,则不会显示错误,因为它会[-d .git]
检查.git
文件夹是否存在。
.git/HEAD
(可能在父目录中)