我想知道是否有办法告诉哪个本地分支正在跟踪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>.remote
和git 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
。