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

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

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

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

对于所有分行:

 git branch -avv 

仅限当地分行:

 git branch -lvv 

仅适用于远程分支:

 git branch -rvv 

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

Jeremy Bouse展示了git remote show如何显示跟踪信息 。 如果你只是想要消费的信息,这应该是足够的。

如果您计划在自动化环境中使用信息(例如脚本),则应该使用较低级(“pipe道”) 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>.remote提取跟踪信息git config branch.<name>.remotegit config branch.<name>.merge (可能使用git for-each-ref为每个本地分支构build命令名称)。

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

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

…或缩写forms,加--abbrev-ref

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

在任何需要提交的地方,通常可以使用branch@{upstream}语法。

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

.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/* 
 git branch -vv 

显示你所要求的。 它显示了当地分支以及他们正在跟踪的相应远程分支。

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

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

我需要为一个循环内的每个本地分支find对应的远程分支(如果有的话),这个循环是在本地分支的列表上进行的。 我结束了使用以下内容:

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

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

尝试与选项的 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