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

Check If Local Branch Exists On Remote Git

我想通过一行命令查看远程上是否存在我新创建的本地分支之一。就像创建一个允许我输入

的别名或函数
git remoteExists <branchName>

现在我手动列出远程上的每个分支并检查我的本地分支是否在那里。这并不像我想的那么容易,因为我们的遥控器有数百个分支,其中许多分支名称相似。

我经常切换分支来处理不同的事情,一次可能有 6-7 个,很难记住我是否已经完成并推送了一个分支,或者我是否还需要完成它。

我已经搜索并找到了一些方法来做类似的事情,但很多似乎不必要地复杂,有没有更简单的方法来做到这一点?

编辑

明确我在做什么。我从一个远程分支开始,并从中创建一个本地分支。我正在对本地分支机构进行更改并进行推送。我不想设置上游分支,因为我不会再使用这个分支;处理远程分支的人将查看我的更改并将它们集成到远程版本中。

这个有效:

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

致命:参数不明确'remotes/origin/TestReadyBranch':未知修订版或路径不在工作树中。 使用 '--' 将路径与修订分开,如下所示: 'git [...] -- [...]'

看到这个错误我就知道远程上不存在这个分支。有更简洁的方法吗?

要检查您的本地分支与上游跟踪分支是否有变化,您可以运行:

git diff @{u}

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

@{upstream}, e.g. master@{upstream}, @{u}

The suffix @{upstream} to a branchname (short form @{u}) refers to the branch that the branch specified by branchname is set to build on top of (configured with branch..remote and branch..merge). A missing branchname defaults to the current one.

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

git diff --quiet @{u}

如果存在差异,这将 return 一个非零退出代码。例如:

git diff --quiet @{u} || echo "You need to push your changes!"
git fetch origin
git branch -r --contains $mybranch

如果您确定任何推送都来自这个特定的回购协议,您可以省略获取。

如果远程上不存在当前分支,这会将退出代码设置为 2:

git ls-remote --heads --exit-code origin "$(git symbolic-ref --short HEAD)"

那你可以签到shell:

if [ $? -eq 2 ]

或在ruby:

if $?.exitstatus == 2

或类似的任何其他语言。

在您的本地 git 文件夹中,您可以执行

git checkout

如果没有对应的远程分支,则没有输出。否则它会打印出本地和远程分支之间的关系(提前,落后,发散等)

注意:这不适用于 1.8.3.1,但适用于 2.16.2

我实际上写了一个小工具来查看我所有回购协议的状态。您可以在 github 上找到它。如果分支的颜色显示为白色,则表示没有远程分支。

  • 白色:本地没有远程
  • 绿色:本地与远程相同
  • 红色:本地与远程发生分歧
  • 紫色:本地领先于远程(有利于推送)
  • 黄色:本地在远程后面(有利于合并)

git branch -r | grep -w <branchName>

应该完成这项工作。

如果远程分支存在,则有输出,否则没有。