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

1234

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

1397

这里有一个命令,可以列出所有已配置为“pull”的跟踪分支,请参见:

$ git branch -vv
  main   aaf02f0 [main/master: ahead 25] Some other commit
* master add0a03 [jdsumsion/master] Some commit

虽然需要浏览SHA和可能很长的提交消息,但这种方法打字快速,而且我可以使跟踪分支在第三列纵向对齐。

如果你需要关于每个分支的“拉取”和“推送”配置信息,请参见另一个回答:git remote show origin


更新

从git版本1.8.5开始,您可以使用git statusgit status -sb显示上游分支。


10
这个输出比git branch -av或者git remote show origin更加直接,因为它只提供被追踪的远程内容,而不会像这两个命令一样给出大量数据。 - SimplGy
82
顺便提一下,最新版本的git(1.8.5.x)在 git statusgit status -sb 中现在也会显示上游分支 -- 所以一旦你升级到1.8.5.x,这个问题(和答案)就不再相关了。 - jdsumsion
15
虽然这可以提供您想要的信息,但我不同意它是正确答案。这只是一种回答方式,就像给某人一本字典回答“XYZ怎么拼写”一样。例如,如果您想要使用得到的答案(分支名称)进行某些操作...此答案仅帮助我在视觉上看到它...不能为您提供可在后续命令中使用的内容。 - UpAndAdam
1
我同意@jonas-berlin的观点--如果您想解析结果,cdunn2001的答案更好--如果您正在寻找一个简单的命令并愿意视觉扫描输出,我的答案也不错。 - jdsumsion
只是为了澄清一下,这种方法在更复杂的设置中不适用,比如你在推送到不同的分支/远程仓库时与拉取的分支不一致。在这种情况下,它只显示配置的合并/拉取分支,而不是分支的默认推送目标。 - undefined
显示剩余3条评论

497

两种选择:

% git rev-parse --abbrev-ref --symbolic-full-name @{u}
origin/mainline
或者
% git for-each-ref --format='%(upstream:short)' "$(git symbolic-ref -q HEAD)"
origin/mainline

14
好的!第一个在未跟踪任何内容时会出现错误,而第二个对于脚本编写特别有帮助。顺便说一下,在“--format”中,“%(refname:short)”是当前引用的名称。 - Tino
13
git help revisions(文档中鲜为人知但非常有用的部分之一),并搜索“upstream”。 - cdunn2001
19
这个答案比前面两个答案好得多,特别是如果你想做类似于 git diff \git rev-parse --abbrev-ref --symbolic-full-name @{upstream}`` 这样的操作。 - Jian
3
这是非常有用的命令:echo 'git for-each-ref --format=\'%(refname:short) -> %(upstream:short)\' refs/heads/$1' > ~/bin/git-show-upstream; chmod +x ~/bin/git-show-upstream - albfan
8
如果您想查找其他分支的上游,第二种选择的变体是:git for-each-ref --format='%(upstream:short)' $(git rev-parse --symbolic-full-name SOMEBRANCH),将SOMEBRANCH替换为分支名称,或使用"HEAD"来表示当前分支。 - Jonas Berlin
显示剩余13条评论

250

我认为git branch -av只告诉你有哪些分支以及它们所在的提交,让你去推断本地分支跟踪哪些远程分支。

git remote show origin明确告诉你哪些分支正在跟踪哪些远程分支。这是一个带有单个提交和名为abranch的远程分支的存储库的示例输出:

$ git branch -av
* abranch                d875bf4 initial commit
  master                 d875bf4 initial commit
  remotes/origin/HEAD    -> origin/master
  remotes/origin/abranch d875bf4 initial commit
  remotes/origin/master  d875bf4 initial commit

对比

$ git remote show origin
* remote origin
  Fetch URL: /home/ageorge/tmp/d/../exrepo/
  Push  URL: /home/ageorge/tmp/d/../exrepo/
  HEAD branch (remote HEAD is ambiguous, may be one of the following):
    abranch
    master
  Remote branches:
    abranch tracked
    master  tracked
  Local branches configured for 'git pull':
    abranch merges with remote abranch
    master  merges with remote master
  Local refs configured for 'git push':
    abranch pushes to abranch (up to date)
    master  pushes to master  (up to date)

5
我需要一个命令发现上游分支,因此使用“origin”作为输入是一种假设,所以这对我无效。 - Alexander Mills
2
但是这确实回答了OP的问题。命令 git remote show origin 会显示本地分支以及它们对于推送和拉取的跟踪情况。 - dudewad
2
我认为这个观点是,该命令假定远程叫做“origin”,但实际上它可能是任何名称(例如,有多个远程分支跟踪不同远程的分支)。 - Ruslan

100

更新:嗯,我发布这篇文章已经过去了几年!对于我的特定目的,即将HEAD与上游进行比较,我现在使用@{u},它是一个快捷方式,指的是上游跟踪分支的HEAD。 (请参见https://git-scm.com/docs/gitrevisions#gitrevisions-emltbranchnamegtupstreamemegemmasterupstreamememuem)。

原始答案:我也遇到过这个问题。我经常在单个存储库中使用多个远程,很容易忘记当前分支正在跟踪哪个远程。有时候知道这一点很方便,比如当您想通过git log remotename/branchname..HEAD查看本地提交时。

所有这些内容都存储在git配置变量中,但您不必解析git配置输出。如果您调用git config,然后是变量的名称,它将只打印该变量的值,无需解析。考虑到这一点,以下是一些有关当前分支跟踪设置的信息的命令:

LOCAL_BRANCH=`git name-rev --name-only HEAD`
TRACKING_BRANCH=`git config branch.$LOCAL_BRANCH.merge`
TRACKING_REMOTE=`git config branch.$LOCAL_BRANCH.remote`
REMOTE_URL=`git config remote.$TRACKING_REMOTE.url`

在我的情況下,因為我只對找出當前遠程的名字感興趣,所以我這樣做:
git config branch.$(git name-rev --name-only HEAD).remote

3
这对于创建一个别名来重新定位到当前分支非常有用。谢谢! - Justin Spahr-Summers
7
实际上,我发现这个命令 git name-rev --name-only HEAD 不能告诉你当前所在的分支。要查看当前所在的分支,我通常使用命令 git branch | grep '^\*' | cut -d' ' -f2 - Altreus
2
谢谢!其他类似问题的答案没有提到@{u}别名/快捷方式,这正是我所需要的!如果你只想确定是否需要拉取,就没有必要与主分支进行比较。 - Dan M.
2
@{u} 真是太棒了。它自 1.7.0 版本以来一直存在,这意味着如果在 2018 年某人使用的 git 中没有可用的版本,那么他们可能需要升级了。 - Chris Cleeland
2
使用 symbolic-ref --short HEAD 命令获取当前分支的单词描述。 - Tom Hale
显示剩余4条评论

62

本地分支和它们的远程分支。

git branch -vv 

所有分支和追踪远程分支。

git branch -a -vv

查看哪些本地分支明确配置了推送和拉取。

git remote show {remote_name}

1
这是正确的答案。例如,git remote show origin实际上会显示我的远程URL。 - kingaj
@kingaj,这需要你知道你的远程仓库(origin)的名称。当你输入 git push 时,你是否100%确定你正在推送到 origin?对我来说并非如此,实际上我在这里寻找简单的答案,因为我的许多别名/快捷方式硬编码了 origin,但有时我会使用多个远程仓库,所以这些别名/快捷方式对我来说是无效的。 - nhed
@nhed,下面的帖子中的模式可能会有所帮助。我刚刚尝试了一下,效果还不错。 - the-typist
@the-typist 是的,我当天就已经点赞了那个答案。它很干净,但如果 git 可以在不必进行多次调用的情况下回答它会更好。我去重新编写了几个以前硬编码 origin 的别名/函数。 - nhed

38

git branch -vv | grep 'BRANCH_NAME'

git branch -vv:此部分将显示所有本地分支及其上游分支。

grep 'BRANCH_NAME':它将从分支列表中过滤出当前分支。


谢谢,我正在使用这个来确定当前分支是否跟踪远程分支。如果其他人也在做同样的事情... 如果没有跟踪的分支,则输出将是 * 'BRANCH_NAME' <commit-sha> 'commit message' 如果有跟踪的分支 * 'BRANCH_NAME' <commit-sha> ['TRACKED_BRANCH_NAME']'commit message' - TMin

32

这将向您展示您所在的分支:

$ git branch -vv

这将仅显示您当前所在的分支:

$ git for-each-ref --format='%(upstream:short)' $(git symbolic-ref -q HEAD)
例如:
myremote/mybranch

您可以通过以下命令找到当前分支使用的远程URL:

git config --get remote.origin.url
$ git remote get-url $(git for-each-ref --format='%(upstream:short)' $(git symbolic-ref -q HEAD)|cut -d/ -f1)
例如:
https://github.com/someone/somerepo.git

获取最后一个远程仓库的快捷方式:git remote get-url $(git for-each-ref --format='%(upstream:remotename)' $(git symbolic-ref -q HEAD)) - elboulangero

26

你可以使用 git checkout 命令,即“检出当前分支”。如果存在,则该命令会显示当前分支的跟踪信息,但不会产生其他影响。

$ git checkout 
Your branch is up-to-date with 'origin/master'.

这似乎无法在git v2.39.0上工作。 - chb

21

还有另一种方式

git status -b --porcelain

这将为您提供

## BRANCH(...REMOTE)
modified and untracked files

简单明了,不需要过多阐述。 - sanjidulhaque
警告:某些特殊情况下,格式可能会有所不同,例如一个全新的空仓库克隆:## No commits yet on master...origin/master [gone] - undefined
最好使用git status -b --porcelain=v2,请参考上面的警告。 - undefined

20

我不确定这是否算作解析git配置输出,但这将确定主分支跟踪的远程仓库的URL:

$ git config remote.$(git config branch.master.remote).url

2
或者,如果你只想获取当前分支所跟踪的远程名称,则使用git config branch.$(git symbolic-ref -q HEAD).remote;要获取 URL,请使用 git config remote.$(git config branch.$(git symbolic-ref -q HEAD).remote).url - Anakhand
1
我需要添加 --short 选项以使其工作。因此,获取当前分支的远程名称:git config branch.$(git symbolic-ref -q --short HEAD).remote ,并获取当前分支远程的 URL :git config remote.$(git config branch.$(git symbolic-ref -q --short HEAD).remote).url - Nelson

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