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

265

我使用以下命令来查找是否存在一个名为 branch-name本地 git 分支。这样做正确吗?有更好的方法吗?

请注意,我是在脚本内执行此操作。因此,如果可能的话,我想使用plumbing命令

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

8
在我无知的情况下,我会使用 git branch | grep -w <branch-name>。虽然这是一个表面命令,但我认为未来不太可能对这种用法进行重大更改,因此这段代码仍然可用。 - UncleZeiv
@UncleZeiv:你可能是对的,这个命令不会有太大变化而变得无法使用。我只是有点强迫症,比如瓷器和管道之类的东西。 - Manoj Govindan
12
git rev-parse --verify <branch_name> 命令可以验证分支名称,也可以验证标签和提交哈希等其他引用。因此,如果你只对分支感兴趣,它可能不太适合你,因为它会返回误报。需要注意的是,翻译过程中不能改变原文意思。 - Paul S.
非常微小的事情,但在更新部分中,应该是git rev-parse --verify <branch-name>(即branch-name而不是branch_name)? - Gautam
2
只有使用git show-ref命令才能确定本地分支是否存在。在更新(使用git rev-parse语法)中,如果远程分支匹配,则返回代码也为0。 - Fabien Bouleau
显示剩余2条评论
18个回答

2

在我的情况下,git show-refgit 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的问题在于,您可能有两个分支具有该名称作为分支名称的子集。即使使用grep的-w标志,您也可能会有mybranch、v2-mybranch、conrad-mybranch等分支。 - Jason Harrison
这个问题已经很老了,但是我要指出你的 git show-branch 输出显示你只有一个(本地)名为 master 的分支。当前提交 你的 master 分支上,其 提交主题mybranch commit。这并不意味着存在一个名为 mybranch 的分支。 - torek

1
git show-branch <BRANCH-NAME> &>/dev/null && echo yes || echo no

1
我的“建议编辑”对于初始问题的“更新”的审核结果是“应该写成评论或答案”,因此我在这里发布它:
所提出的另一种方法不仅会验证分支,还会验证任何具有类似名称的引用@jhuynh
git rev-parse --verify <reference-name>
# $? == 0 means reference with <reference-name> exists.

关于初始问题中“更新”的问题解释:

假设并检查'master.000'只是一个标签,这样的本地分支不存在,grep返回一个条目,其中一个是标签。即使这样的本地分支不存在,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

这是我的实现方式,我认为看起来更加稳定

$branchExists = git ls-remote $gitUrl $gitBranch
if(!([bool]$branchExists))
{
   Write-Host "branch $branchName does not exist"  
} 
else
{
   Write-Host "branch $branchName exists"         
}

如果该分支存在,则branchExist变量的内容可能类似于:
hashcode of branch name         feature/my_branch

0

要验证在远程是否存在分支,这对我很有效:

git branch -r | grep -qn origin/${GIT_BRANCH_NAME}$ && echo "branch exists" || echo "branch does not exists"

-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。


尝试过这个,它每次都会返回0。你可以执行git branch -a | grep remotes/origin/Catalog_3.2.3.07 | wc -l。 - NiharGht

-2

如果你能够包含grep。

git branch | grep -q <branch>

1
如果您在分支名称中使用点号(“.”)(像我有时会这样做),那么这可能会给您错误的答案,因为点号被grep解释为元字符。 - Peter John Acklam
1
如果您测试一个名称是真实分支的子字符串的分支,也会出现错误匹配。例如,如果有一个名为“abcdef”的分支,则“abc”将匹配。 - rjmunro

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接