找出本地分支正在追踪哪个远程分支

1234

40
天啊,这并不是完全重复的。这是另一个问题的子集,但是还有其他方法可以提出这个问题,比如git remote show origin。另一个问题的主要答案是一个包装在简单答案周围的Bash脚本,这可能对一些人有用。希望这个问题不会被完全关闭。 - cdunn2001
8
同意,这绝对不应该是重复的。它询问的内容与链接问题完全不同。 - Adam Batkin
26个回答

20

git-status瓷器(机器可读)v2输出如下:

$ git status -b --porcelain=v2
# branch.oid d0de00da833720abb1cefe7356493d773140b460
# branch.head the-branch-name
# branch.upstream gitlab/the-branch-name
# branch.ab +2 -2

仅获取上游分支:

$ git status -b --porcelain=v2 | grep -m 1 "^# branch.upstream " | cut -d " " -f 3-
gitlab/the-branch-name

如果该分支没有上游,上述命令将产生空输出(或在设置 set -o pipefail 的情况下失败)。


我喜欢这个解决方案,因为它允许在脚本中检测是否为本地分支配置了任何上游分支,而不需要知道它们的名称。 - Michał Góral
功能很好,不过对于大型仓库来说有点不足,而且在分支信息之后可能会添加一段冗长且无用的输出。 - undefined
为了加快速度并避免可能的不必要的长输出,请使用不存在的目录,例如 git status -b --porcelain=v2 .non-existing-dir - undefined

11

另一种简单的方法是在git repo中使用

cat .git/config

这将列出本地分支的详细信息


在Linux上运行得很好。除非在类Unix提示符下(例如cygwin或git bash),否则无法在Windows上运行。 - Contango
在Windows中,只需使用type .git/config而不是cat .git/config,当然是在普通命令行上。 - khmarbaise

10

不使用 grep,仅显示当前分支信息:

git branch -vv --contains

这是缩写:

git branch -vv --contains HEAD

如果你当前的 HEAD 提交 ID 在其他分支中出现,那么这些分支也将显示出来。


10

如果你只想知道某个方法是否存在,还有一种方法(感谢osse):

if git rev-parse @{u} > /dev/null 2>&1
then
  printf "has an upstream\n"
else
  printf "has no upstream\n"
fi

什么语言?这看起来像是Linux shell脚本,但没有提供其他信息或上下文。 - Suncat2000

9
git branch -r -vv

将列出包括远程的所有分支。


7
您可以尝试这个方法:
git remote show origin | grep "branch_name"

branch_name 需要替换为您的分支


1
如果您的分支名称也与其他分支匹配,会发生什么情况?如果您的分支名称与git remote show origin输出中的其他文本匹配 - 如果它被称为mergesconfigure,会发生什么? - Tom Swirly
没听懂你的意思。你是指多个分支有相同的名称吗? - xpioneer
“匹配其他分支”的示例:当前分支是“foo”,但还有“foobar”与grep匹配;当前分支是“v3.4”,但正则表达式中的“.”表示任何字符,因此也会匹配“v314”... - Beni Cherniavsky-Paskin

6

列出本地和远程分支:

$ git branch -ra

输出:

  feature/feature1
  feature/feature2
  hotfix/hotfix1
* master
  remotes/origin/HEAD -> origin/master
  remotes/origin/develop
  remotes/origin/master

5

如果你想找到任何分支的上游(与你所在的分支不同),这里是对@cdunn2001答案的略微修改:

git rev-parse --abbrev-ref --symbolic-full-name YOUR_LOCAL_BRANCH_NAME@{upstream}

这将为名为YOUR_LOCAL_BRANCH_NAME的本地分支提供远程分支名称。


git rev-parse --abbrev-ref --symbolic-full-name HEAD@{upstream} 对我来说已经可以了 :) - Pierre-Antoine Guillaume

4

我尝试过这里提供的所有解决方案,但发现没有一个适用于所有情况:

  • 适用于本地分支
  • 适用于分离状态下的分支
  • 适用于CI环境

该命令获取所有名称:

git branch -a --contains HEAD --list --format='%(refname:short)'

对于我的应用程序,我需要过滤掉HEAD & master引用,偏爱远程引用,并去除单词“origin/”。如果找不到这个条件,那么使用第一个没有/(的非HEAD引用。


3

这个答案的基础上,我想出了以下的.gitconfig别名:

branch-name = "symbolic-ref --short HEAD"
branch-remote-fetch = !"branch=$(git branch-name) && git config branch.\"$branch\".remote || echo origin #"
branch-remote-push  = !"branch=$(git branch-name) && git config branch.\"$branch\".pushRemote || git config remote.pushDefault || git branch-remote-fetch #"
branch-url-fetch = !"remote=$(git branch-remote-fetch) && git remote get-url        \"$remote\" #"  # cognizant of insteadOf
branch-url-push  = !"remote=$(git branch-remote-push ) && git remote get-url --push \"$remote\" #"  # cognizant of pushInsteadOf

这是哪种编程语言? - erik258
3
@Dan Farrell:以!开头的别名使用/bin/sh。双引号是为了在git的配置文件中进行引用。 - Tom Hale
最佳答案,对于一个空仓库的克隆同样适用。与git status -b --porcelain不同的是,它快速且易于解析。 - undefined

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