题 如何判断哪个本地分支正在跟踪Git中的哪个远程分支?


我想知道是否有办法告诉哪个本地分支正在跟踪Git中的哪个远程分支。

我正在使用一个名为“origin”的远程服务器。


231
2017-08-27 01:04




纠正我,如果我错了,但不是'它是一个默认名为origin而不是服务器的远程分支? - Chris Halcrow


答案:


使用我从Github.com上游Git存储库检出的Puppet副本示例...

$ git remote show origin
* remote origin
  Fetch URL: git://github.com/reductivelabs/puppet.git
  Push  URL: git://github.com/reductivelabs/puppet.git
  HEAD branch: master
  Remote branches:
    0.24.x                 tracked
    0.25.x                 tracked
    2.6.x                  tracked
    master                 tracked
    next                   tracked
    primordial-ooze        tracked
    reins-on-a-horse       tracked
    testing                tracked
    testing-17-march       tracked
    testing-18-march       tracked
    testing-2-april        tracked
    testing-2-april-midday tracked
    testing-20-march       tracked
    testing-21-march       tracked
    testing-24-march       tracked
    testing-26-march       tracked
    testing-29-march       tracked
    testing-31-march       tracked
    testing-5-april        tracked
    testing-9-april        tracked
    testing4268            tracked
  Local branch configured for 'git pull':
    master merges with remote master
  Local ref configured for 'git push':
    master pushes to master (up to date)

然后,如果我要执行以下操作:

$ git checkout -b local_2.6 -t origin/2.6.x 
Branch local_2.6 set up to track remote branch 2.6.x from origin.
Switched to a new branch 'local_2.6'

最后重新运行了 git remote show origin 再次命令我会在底部附近看到以下内容:

  Local branches configured for 'git pull':
    local_2.6 merges with remote 2.6.x
    master    merges with remote master

197
2017-08-27 03:03



这意味着你可以跟踪木偶中的所有远程分支,尽管你有一些本地分支。你在命令的结果中看到的许多“跟踪”标志是什么意思? “跟踪”哪个地方分支机构? - PJ.
如果你做的话,跟踪远程分支 git fetch 要么 git pull 将在克隆的存储库中跟踪远程分支的更新。本地分支就是这样,当给出适当的命令时,远程分支的本地分支以及远程分支的更新将被跟踪和合并。我在制作本地分支时明确包含'-t'选项,以确保它跟踪它所源自的分支。请记住,本地分支也可以跟踪另一个本地分支,因此不必是远程分支。 - Jeremy Bouse
@PJ:术语“轨道”在Git中有两个不同的含义。中的“跟踪”线 git remote show remote-name 参考 “跟踪分支” (来自远程存储库的分支的快照)。 “与...合并”是指具有。的本地分支 “上游分公司” 配置(使用 --track/-t 的选择 git branch 要么 git checkout 因而经常与“跟踪分支”混淆。 - Chris Johnsen
“远程跟踪分支“是上面提到的”跟踪分支机构“的最新词汇表条目。该文档已更新 8b3f3f84。 - ento


对于所有分支:

git branch -avv

仅限本地分支机构:

git branch -lvv

仅适用于远程分支:

git branch -rvv

显示所有分支以及上游分支的名称。


122
2018-02-14 16:02



这是迄今为止最简单,最全面的答案!
在git版本1.7.7.5上,这显示了本地分支和它指向的sha-1,但它没有显示被跟踪的远程分支... - mpontillo
适用于我的git版本1.7.4.1第二个'v'是显示远程跟踪分支所必需的。 - Peter Johnson
减少产量 git branch -lvv 只显示带有上游的本地分支可能很有用 - A B
^git branch -vv 对我有用...... - notacouch


Jeremy Bouse说明 怎么样 git remote show 显示跟踪信息。如果您只想要人类消费的信息,这应该足够了。

如果您打算在自动上下文(例如脚本)中使用该信息,则应使用较低级别(“管道”) git for-each-ref 代替。

% git remote show origin
* remote origin
⋮
  Local branches configured for 'git pull':
    master merges with remote master
    pu     merges with remote pu
⋮
% git for-each-ref --format='%(refname:short) <- %(upstream:short)' refs/heads
master <- origin/master
pu <- origin/pu

git for-each-ref 学到了 %(upstream) 令牌 Git 1.6.3。使用早期版本的Git,您必须提取跟踪信息 git config branch.<name>.remote 和 git config branch.<name>.merge (可能使用 git for-each-ref 为每个本地分支名称构建命令)。


52
2017-08-27 03:18



你的答案输出更简洁,更容易理解,所以你得到了投票:) - CubanX
为了使它不那么简洁,但提供了一种很好的方法来直观地检查远程名称是否与本地分支名称相同,这是一个常见的git问题:在bash中 git for-each-ref --format=$'\n'' '' '' '' '' '' ''/%(refname:short);%(upstream:short)' refs/heads | tr ';' $'\n' - hobs


对于特定分支,您可以使用 git rev-parse 随着 @{u} 要么 @{upstream} 分支名称上的后缀,例如:

$  git rev-parse --symbolic-full-name master@{u}
refs/remotes/github-mhl/master

...或缩写形式,添加 --abbrev-ref

$ git rev-parse --symbolic-full-name --abbrev-ref master@{u}
github-mhl/master

你一般可以使用 branch@{upstream} 语法在何处提交。


18
2018-05-01 09:18



+1你的答案给了我我所需要的东西: git rev-parse --symbolic-full-name HEAD 与 git rev-parse --symbolic-full-name HEAD@{u}, 谢谢! - Tino


我使用以下shell脚本(命名为 git-tracks)显示当前分支跟踪的远程分支:

#!/bin/sh -e
branch=$(git symbolic-ref HEAD)
branch=${branch##refs/heads/}
remote=$(git config "branch.${branch}.remote")
remoteBranch=$(git config "branch.${branch}.merge")
remoteBranch=${remoteBranch##refs/heads/}

echo "${remote:?}/${remoteBranch:?}"

这也可以使用上面提到的 git for-each-ref,但我发现直接访问比过滤当前分支的输出要简单一些。


10
2018-01-21 14:26



您可以考虑在脚本顶部使用“set -e”。这将允许您删除“|| exit $?”的所有实例同时保留相同的失败早期行为。 - John Whitley
@JohnWhitley:谢谢,我编辑了我的答案。我知道 set -e,但通常坚持明确的检查。但在这种情况下,它真的更好。 - Ingo Karkat
不适合我 git version 1.9.4。没有回声:( - Ain


.git/config 文件还将提供跟踪分支信息

[remote "Hub"]
    url = ssh://xxxx/tmp/Hub
    fetch = +refs/heads/*:refs/remotes/Hub/*
[branch "develop"]
    remote = Hub
    merge = refs/heads/develop
[branch "Dev1"]
    remote = Test
    merge = refs/heads/Dev1
[remote "Test"]
    url = ssh://xxxx/tmp/gittesting/Dev1GIT
    fetch = +refs/heads/*:refs/remotes/Test/*

8
2017-10-11 12:59





git branch -vv

显示你要求的确切内容。它显示了本地分支以及它们正在跟踪的相应远程分支。


5
2018-05-07 07:50





将这些符文添加到 [alias] 你的.gitconfig文件的一部分:

show-tracking = !sh -c 'git ls-remote . |grep `git log -1 --grep="git-svn-id" --format=%H`|perl -pe "s/[[:alnum:]]+[[:space:]]//"'

2
2018-03-07 16:48





我需要为作用于本地分支列表的循环中的每个本地分支找到相应的远程分支(如果有的话)。我最终使用了以下内容:

git for-each-ref --format='%(refname:short):%(upstream:short)' refs/heads | grep "^LocalBranchName:.*/" | sed "s/^LocalBranchName://"

这将为没有相应远程分支(“someremote / somebranch”)的本地分支输出任何内容(空字符串)。


0
2017-11-23 00:08





尝试 git branch  有选项

 -r
List or delete (if used with -d) the remote-tracking branches. 

-a
List both remote-tracking branches and local branches. 

否则,检查你的 .git/config


-1
2017-08-27 01:12



他们显示分支,但我不明白哪一个跟踪哪个。 - PJ.