检查本地分支是否存在于远程Git上

11

我想查看一个新创建的本地分支是否存在于远程,并用一行命令实现。就像创建一个别名或函数,使我能够输入

git remoteExists <branchName>

现在我手动列出远程所有分支并检查本地分支是否存在。由于我们的远程仓库有数百个类似名称的分支,这不像我想象中那么容易。

我经常切换分支,同时处理不同的任务,可能会有6-7个分支,很难记住我是否完成并推送分支,或者我是否仍然需要完成它。

我搜索并发现一些类似的操作方式,但许多方法似乎过于复杂了,是否有更简单的方法呢?

编辑

明确一下我的操作。我从一个远程分支开始,并创建一个本地分支。我对本地分支进行更改并推送。我不想设置上游分支,因为我将不再使用这个分支;处理远程分支的人将查看我的更改并将其集成到远程版本中。

以下是有效的:

git diff <branchName> remotes/origin/<branchName>

致命错误:模糊的参数'remotes/origin/TestReadyBranch':未知的修订版本或路径不在工作树中。 使用“--”将路径从修订版本分离出来,像这样: 'git [...] -- [...]'

看到这个错误,我就知道远程不存在该分支。有没有更简单的方法做到这一点?


假设您正在运行UNIX,git-prompt.sh文件中的提示扩展在contrib中有一些函数,可以将此信息添加到您的提示符中。比每次重新输入要快得多。 - Noufal Ibrahim
如果您没有设置上游,您需要告诉 Git 您想将本地分支与哪个远程分支进行比较。否则,您的问题就没有意义。 - jub0bs
@Alex 那么你的命令应该再加一个参数;类似于 git isPushed <branchName> <remoteBranchName>,就像这样:“我需要将 <branchName> 推送到 <remoteBranchName> 吗?”。 - jub0bs
1
@Alex,你的问题不太清楚。你写道“我想知道该分支在远程不存在”。这是你想要检查的全部吗? - jub0bs
1
@Alex,“被推送”和“存在”我以为是同一个意思。不是的。 - jub0bs
显示剩余3条评论
5个回答

14
git fetch origin
git branch -r --contains $mybranch

如果你确定所有推送都来自这个特定的仓库,那么可以省略获取操作(fetch)。


4
在您的本地 git 文件夹中,您可以执行以下操作:
git checkout

如果没有相应的远程分支,则不会有输出。否则,它将打印出本地和远程分支之间的关系(ahead,behind,diverged等)。
注意:这对于1.8.3.1不起作用,但对于2.16.2有效。
我实际上编写了一个小工具来查看所有我的存储库的状态。您可以在github上找到它。如果分支的颜色为白色,则表示没有远程分支。
  • 白色:本地没有远程
  • 绿色:本地与远程相同
  • 红色:本地与远程分歧
  • 紫色:本地领先于远程(可以推送)
  • 黄色:本地落后于远程(适合合并)
enter image description here

3

如果您想检查本地分支与上游跟踪分支的差异,可以运行以下命令:

git diff @{u}

其中@{u}指的是上游分支名称。来自于git-rev-parse(1)手册:

@{upstream},例如 master@{upstream}@{u}

在分支名后缀中加入@{upstream}(简写为@{u})表示该分支建立在另一个分支之上(由branch..remotebranch..merge配置)。如果没有提供分支名,则默认使用当前分支。

这将输出典型的git diff输出,显示本地分支和上游跟踪分支之间的差异。如果您想将其用作shell命令的一部分(例如,用于设置提示符或其他内容),可以添加--quiet选项:

git diff --quiet @{u}

如果有差异,这将返回一个非零退出代码。例如:

git diff --quiet @{u} || echo "You need to push your changes!"

1
这个不起作用。它说致命错误:分支<分支名称>没有上游配置。 - Alex
实际上,“您需要推送更改!”这条消息有点误导。可能情况是上游分支超前于本地分支,此时用户应该先拉取,然后再推送。 - jub0bs
@Alex 你必须设置你的分支的上游(使用git branch --set-upstream ...)。如果你的本地分支没有与任何远程分支关联,询问是否需要推送是没有意义的。 - jub0bs
我不认为这是误导性的。你的本地分支有一些远程分支上没有的更改,所以需要推送。如果上游自您上次更新远程分支以来已经进展,那么您可能需要重新同步本地分支,但在合并/变基后,您仍然可能有未解决的本地更改。无论如何,这只是一个例子。请随意用您自己的消息替换它。 - larsks
@larsks 感谢您及时详细的回答,我非常感激。我宁愿不设置上游,已经编辑了我的问题以更好地反映我想要实现的目标。 - Alex

2
如果当前分支在远程不存在,这将设置退出代码为2:
git ls-remote --heads --exit-code origin "$(git symbolic-ref --short HEAD)"

然后您可以在shell中检查:
if [ $? -eq 2 ]

或者在Ruby中:

if $?.exitstatus == 2

或在任何其他语言中同样适用。

对我来说非常有效。非常感谢!我使用了这个条件: if [[ -z $(git ls-remote --heads --exit-code origin "$(git symbolic-ref --short HEAD)") ]]; then echo "branch does not exist on remote"; fi - Eyal Gerber

1
git branch -r | grep -w <branchName>

如果远程分支存在,则会输出内容,否则不会有任何输出。应该做好这个工作。

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