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


234

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

我正在使用一台名为“起源”的远程服务器。


纠正我,如果我错了,但是它不是默认情况下名为origin而不是服务器的远程分支吗?
克里斯·哈克罗

Answers:


196

使用我从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

1
因此,这是否意味着您可以跟踪local中的所有远程分支,尽管您有一些本地分支。您在命令结果中看到的许多“已跟踪”符号是什么?由哪个本地分支机构“跟踪”?
PJ。

跟踪远程分支的方式是,如果您执行git fetchgit pull,则将在克隆的存储库中跟踪对远程分支的更新。本地分支就是远程分支的本地分支,因此在给出适当的命令时,将跟踪并合并对远程分支的更新。在创建本地分支时,我明确包含了“ -t”选项,以确保它跟踪其起源的分支。请记住,本地分支也可以跟踪另一个本地分支,因此不必是远程分支。
Jeremy Bouse

5
@PJ:术语“轨道”在Git中有两个不同的含义。中的“跟踪”行是git remote show remote-name“跟踪分支”(来自远程存储库的分支快照)。“与...合并”行是指具有“上游分支”配置的本地分支(使用git branchgit checkout--track/ -t选项制成,因此经常与“ tracking branch”混淆)。
克里斯·约翰森

远程跟踪分支 ”是上述“跟踪分支”的最新词汇表条目。该文档已在8b3f3f84中进行了更新。
ento 2013年

124

对于所有分支机构:

git branch -avv

仅对于本地分支机构:

git branch -lvv

仅对于远程分支:

git branch -rvv

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


2
这是迄今为止最简单,最完整的答案!

6
在git版本1.7.7.5上,这向我显示了本地分支及其指向的sha-1,但未显示跟踪的远程分支...
mpontillo 2012年

在git版本1.7.4.1上对我有效,需要第二个“ v”以显示远程跟踪分支。
彼得·约翰逊

4
减少输出git branch -lvv显示仅上游的本地分支可能有用
AB

5
^ git branch -vv为我工作...
notacouch 2013年

52

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>.remotegit config branch.<name>.merge(可能使用git for-each-ref来为每个本地分支名称构建命令)提取跟踪信息。


您的答案输出更加简洁明了,更易于遵循,因此您获得了最高投票:)
CubanX 2012年

为了使其简洁,但提供了一种很好的方式来直观地检查远程名称是否与本地分支名称相同,这是一个常见的git gotcha:in bashgit for-each-ref --format=$'\n'' '' '' '' '' '' ''/%(refname:short);%(upstream:short)' refs/heads | tr ';' $'\n'
hobs

19

对于特定的分支,可以使用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}在需要提交的地方使用语法。


1
+1您的回答给了我我所需要的:git rev-parse --symbolic-full-name HEADvs. git rev-parse --symbolic-full-name HEAD@{u},谢谢!
Tino 2012年

10

我使用以下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,但是我发现直接访问比过滤当前分支的输出要简单一些。


您可以考虑在脚本顶部使用“ set -e”。那将允许您删除所有“ || exit $?”实例。同时保留相同的早期失败行为。
约翰·惠特利

@JohnWhitley:谢谢,我已经编辑了答案。我知道set -e,但是通常坚持显式检查。但是在这种情况下,它确实更好。
Ingo Karkat,2012年

不为我工作git version 1.9.4。回声报什么:(
艾因

8

.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/*

5
git branch -vv

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


2

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

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

0

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

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

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


-1

尝试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


3
它们显示分支,但我不知道哪个正在跟踪哪个。
PJ。
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.