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

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

评论

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

#1 楼

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


评论


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

– PJ。
10年8月28日在1:27

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

– Jeremy Bouse
10年8月28日在4:20

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

–克里斯·约翰森(Chris Johnsen)
10年8月28日在5:40

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

– ento
2013年9月12日下午4:43

#2 楼

对于所有分支机构:

git branch -avv


仅对于本地分支机构:

git branch -lvv


仅对于远程分支机构:

git branch -rvv


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

评论


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

–user114812
2012年3月21日晚上10:25

在git版本1.7.7.5上,这向我显示了本地分支和它指向的sha-1,但未显示跟踪的远程分支...

– mpontillo
2012年4月6日19:44

在git版本1.7.4.1上对我有用,需要第二个“ v”以显示远程跟踪分支。

– Peter Johnson
2012年7月25日在11:21



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

– A B
2012年11月27日23:56



^ git branch -vv为我工作...

–notacouch
13年3月21日在20:48

#3 楼

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

评论


您的答案输出更加简洁明了,更容易理解,因此您获得了最高投票:)

–CubanX
2012年1月12日19:58

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

–滚刀
13年5月15日在17:05



#4 楼

对于特定分支,可以在分支名称上使用带有git rev-parse@{u}后缀的@{upstream},例如:

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


通常,在需要提交的地方都可以使用--abbrev-ref语法。

评论


+1您的答案完全满足了我的需求:git rev-parse --symbolic-full-name HEAD vs. git rev-parse --symbolic-full-name HEAD @ {u},谢谢!

– Tino
2012年7月4日在16:55

#5 楼

我使用以下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 $?”的所有实例。同时保留相同的早期失败行为。

–约翰·惠特利
2012年7月31日在21:26

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

– Ingo Karkat
2012年8月1日在6:39

在git版本1.9.4上不适合我。没有回声:(

– Ain
2014年9月3日15:57

#6 楼

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


#7 楼

git branch -vv


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

#8 楼

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

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


#9 楼

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

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


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

#10 楼

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

评论


它们显示分支,但我不知道哪个正在跟踪哪个。

– PJ。
2010年8月27日在2:42