有没有更好的方法来找出本地git分支是否存在?


191

我正在使用以下命令来查找我的存储库中是否存在具有本地 git分支branch-name。这样对吗?有没有更好的办法?

请注意,我正在脚本中执行此操作。因此,如果可能的话,我想使用管道命令

git show-ref --verify --quiet refs/heads/<branch-name>
# $? == 0 means local branch with <branch-name> exists. 

您的命令看起来像我使用的命令。
圣保罗Ebermann

6
由于我的无知,我会和git branch | grep -w <branch-name>。好的,这是瓷器命令,但是我无法想象这种特殊用法将来会发生重大变化,
以致

@UncleZeiv:您可能是正确的,该命令不会显着更改以使其无法使用。关于瓷器和水暖之类的东西,我有点强迫症,仅此而已。
Manoj Govindan

9
git rev-parse --verify <branch_name>还会验证其他引用(例如标记和提交哈希),因此尽管它可能更适合您的需求,但是如果您仅对分支感兴趣,则会返回误报。
Paul S.

2
只有git show-ref可以确定本地分支是否存在。在更新(带有git rev-parse的语法)中,如果远程分支匹配,则返回码也为0。
法比恩·布勒

Answers:


57

据我所知,这是在脚本中执行此操作的最佳方法。我不确定是否还有更多要添加的内容,但是可能还有一个答案只是说“该命令可以完成您想要的一切” :)

您可能需要注意的唯一一件事是分支名称中可能包含令人惊讶的字符,因此您可能需要引用<branch-name>


1
关于报价的好处<branch-name>。FWIW我在结构脚本中使用它。我会记得引用该变量。
Manoj Govindan

正确的答案是隐式的:git show-ref --verify --quiet refs / heads / <branch-name>将显示HEAD不是正确的分支。git rev-parse --verify会告诉您HEAD是一个现有分支。错误,因为HEAD不是分支。
Paulo Neves

106

当我在搜索引擎上搜索“ git check是否存在分支”时,此页面是我看到的第一个页面。

我得到了想要的东西,但是由于原始帖子来自2011年,所以我想提供一个更新的答案。

git rev-parse --verify <branch_name>

这基本上与接受的答案相同,但是您不需要键入“ refs / heads /”


20
仅需注意:git rev-parse --verify仅告诉您存储库中是否存在这样的对象(即,对于<branch_name>将转换为存储库中任何类型的对象的任何值,它将返回0 )。它不会告诉您该对象是否为分支。
tavnab

9
这不是问题的正确答案,该问题询问如何知道分支是否存在。这会使您误判标签。您可以自己轻松地对此进行测试。您需要refs / heads /来区别refs / tags中的标记,甚至是refs / remotes中的远程标记。
msouth

15
git rev-parse --verify gh-pages 给了我:致命的:需要一个修订
SuperUberDuper

@SuperUberDuper您是否尝试过:git rev-parse --verify ** origin / ** gh-pages?
RoyalBigMack

33

差不多了。

只需省略--verify--quiet,如果分支存在,则将得到哈希,否则将得到哈希。

将其分配给变量并检查是否为空字符串。

exists=`git show-ref refs/heads/<branch-name>`
if [ -n "$exists" ]; then
    echo 'branch exists!'
fi

10
返回值就足够了-您无需进行可能容易出错的分配变量的工作。
msouth

15

我想你可以git show-branch在这里使用。

$ git show-branch --list
  [master] test
* [testbranch] test
$ git show-branch testbranch
[testbranch] test
$ echo $?
0
$ git show-branch nonexistantbranch
fatal: bad sha1 reference nonexistantbranch
$ echo $?
128

那么,$?== 0表示该分支存在,您根本不必深入研究refs / heads /管道。只要您不传递-r给show-branch,它就只能在本地分支上运行。


5
AFAIK git show-branch瓷器命令。正如我在问题中所说的那样,如果有管道等效项可用,我宁愿不在脚本中使用瓷器命令。参见kernel.org/pub/software/scm/git/docs
Manoj Govindan

3
@Manoj:我了解瓷器和水暖器,但是我从未读过它被认为比瓷器更稳定。感谢您在文档中指出我。
Mark Drago

为了避免错误地找到标签,并且更具体地说明分支是本地分支还是远程分支,可以指定git show-branch refs/heads/[branch]git show-branch refs/remotes/origin/[branch]
twasbrillig

13

我推荐git show-ref --quiet refs/heads/$name

  • --quiet 表示没有输出,这很好,因为这样您就可以干净地检查退出状态。

  • refs/heads/$name限制本地分支并匹配全名(否则dev将匹配develop

脚本中的用法:

if git show-ref --quiet refs/heads/develop; then
    echo develop branch exists
fi

是的,这是唯一一个无声地执行此操作的人。git命令的命名有点
古怪

10

用于脚本中:

git show-ref -q --heads <branch-name>

0当且仅当<branch-name>作为本地分支存在时,该出口才会退出。

例:

if git show-ref -q --heads <branch-name>; then
   echo 'Branch exists'
fi

2

在Windows批处理脚本上有点不同,

git rev-parse --verify <branch>

if %ERRORLEVEL% == 0  (
    echo "Yes"
) else (
    echo "No"
)


1

称呼它git is_localbranch(您需要在中添加别名.gitconfig)。

用法:

$ git is_localbranch BRANCH

资源:

git branch | grep -w $1 > /dev/null
if [ $? = 0 ]
then
  echo "branch exists"
fi

1

我的“建议编辑”为初始问题的“更新”的审查结果为“应将其写为评论或答案”,因此我将其张贴在这里:

提出的另一种方法不仅将验证分支,而且将验证任何具有@jhuynh名称的引用

git rev-parse --verify <reference-name>
# $? == 0 means reference with <reference-name> exists.

初始停顿的“更新”问题说明:

让我们假设并检查'master.000'只是一个标签,这样的本地分支不存在,grep返回一个条目,其中wchich是一个标签。如果引用存在,则即使rev-parse仍然返回0,即使该本地分支不存在。完全是@ paul-s所说的错误匹配

$ git show-ref |grep master.000

f0686b8c16401be87e72f9466083d29295b86f4a refs/tags/master.000
$ git rev-parse --verify master.000
f0686b8c16401be87e72f9466083d29295b86f4a
$ echo $?
0


0

既不git show-ref也不git rev-parse在我的情况下工作。

$ git --version
git version 2.21.0

$ git show-branch --list
* [master] mybranch commit

$ BRANCH_NAME=mybranch
$ git rev-parse --verify $BRANCH_NAME
fatal: Needed a single revision

$ git show-ref refs/heads/$BRANCH_NAME
<no otput>
$ [ $? == 0 ] && echo "$BRANCH_NAME exists" || echo "$BRANCH_NAME not exists"
mybranch not exists

我结束了这个

$ BRANCH_NAME=mybranch
$ SHOW_ALL=`git show-branch --all | grep -w $BRANCH_NAME`
$ [ $? == 0 ] && echo "$BRANCH_NAME exists" || echo "$BRANCH_NAME not exists"
mybranch exists

您也可以使用脚本文件

#!/bin/sh
BRANCH_NAME=mybranch
if grep -Fqe $BRANCH_NAME << EOF
`git show-branch --all`
EOF
then
   echo "$BRANCH_NAME exists"
else
   echo "$BRANCH_NAME not exists"
fi

-1

如果可以设法包括grep。

git branch | grep -q <branch>

1
如果您像我有时一样在分支名称中使用点(“。”),可能会给您错误的答案,因为点被解释grep为元字符。
彼得·约翰·阿克兰

1
如果您测试名称为真实分支的子字符串的分支,则也会得到误报。例如,abc如果有一个名为的分支将匹配abcdef
rjmunro 2015年

-1

要在脚本中使用,建议使用以下命令:

git ls-remote --heads <repo_url> "<branch_name>" | wc -l

注意,<repo_url>可以只是一个“。” 如果位于本地目录的目录结构,本地仓库的路径或远程仓库的地址中,则指定本地仓库。

如果<branch_name>不存在,则命令返回0,如果存在则返回1。


-1
git branch --list $branch_name | grep $branch_name

然后检查返回值为0或1。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.