I would like to know if there's a way to tell which local branch is tracking which remote branch in Git.
I'm using one remote server, which is named "origin".
Server Fault is a question and answer site for system and network administrators. It only takes a minute to sign up.
Sign up to join this communityI would like to know if there's a way to tell which local branch is tracking which remote branch in Git.
I'm using one remote server, which is named "origin".
Using the example of my copy of Puppet checked out from the upstream Git repository on Github.com...
$ 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)
Then if I were to execute the following:
$ 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'
And finally re-run the git remote show origin
command again I will then see the following down near the bottom:
Local branches configured for 'git pull':
local_2.6 merges with remote 2.6.x
master merges with remote master
git fetch
or git pull
updates to the remote branches will be tracked in your cloned repository. The local branches are just that, local branches of the remote branches and thus updates to the remote branches will be tracked and merged in when the appropriate command to do so is given. I explicitly include the '-t' option when making the local branch to ensure it tracks the branch from which it originated from. Remember a local branch can also track another local branch so doesn't have to be a remote branch.
Aug 28, 2010 at 4:20
git remote show remote-name
refer to “tracking branches” (snapshots of branches from remote repositories). The “merges with” lines refer to local branches that have an “upstream branch” configuration (made with with the --track
/-t
option of git branch or git checkout and thus often confused with “tracking branches”).
Aug 28, 2010 at 5:40
For all branches:
git branch -avv
For local branches only:
git branch -lvv
For remote branches only:
git branch -rvv
shows you all branches as well as the name of the upstream branch.
git branch -lvv
show just local branches with upstream might be useful
Jeremy Bouse illustrates how git remote show
displays tracking information. That should be sufficient if you only want the information for human consumption.
If you plan on using the information in an automated context (e.g. a script) you should use the lower-level (“plumbing”) git for-each-ref
instead.
% 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
The git for-each-ref
learned the %(upstream)
token in Git 1.6.3. With earlier versions of Git you will have to extract the tracking information with git config branch.<name>.remote
and git config branch.<name>.merge
(probably using git for-each-ref
to build the commands for each local branch name).
git for-each-ref --format=$'\n'' '' '' '' '' '' ''/%(refname:short);%(upstream:short)' refs/heads | tr ';' $'\n'
For a particular branch, you can use git rev-parse
with the @{u}
or @{upstream}
suffix on the branch name, e.g.:
$ git rev-parse --symbolic-full-name master@{u}
refs/remotes/github-mhl/master
... or for the abbreviated form, add --abbrev-ref
$ git rev-parse --symbolic-full-name --abbrev-ref master@{u}
github-mhl/master
You can generally use the branch@{upstream}
syntax wherever a commit is expected.
git rev-parse --symbolic-full-name HEAD
vs. git rev-parse --symbolic-full-name HEAD@{u}
, thanks!
I use the following shell script (named git-tracks
) to show the remote branch that is tracked by the current branch:
#!/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:?}"
This could also use the mentioned git for-each-ref
, but I found the direct access somewhat simpler than filtering the output for the current branch.
set -e
, but usually stick to the explicit checking. But in this case, it's really better.
Aug 1, 2012 at 6:39
.git/config
file also will provide the tracking branch info as
[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
shows exactly what you ask for. It shows the local branches together with the corresponding remote branch they are tracking.
Add these runes to the [alias]
section of your .gitconfig file:
show-tracking = !sh -c 'git ls-remote . |grep `git log -1 --grep="git-svn-id" --format=%H`|perl -pe "s/[[:alnum:]]+[[:space:]]//"'
I needed to find the corresponding remote branch (if any) for each local branch within a loop that was acting on a list of the local branches. I ended up using the following:
git for-each-ref --format='%(refname:short):%(upstream:short)' refs/heads | grep "^LocalBranchName:.*/" | sed "s/^LocalBranchName://"
This will output nothing (an empty string) for local branches that don't have a corresponding remote branch ("someremote/somebranch").
Try git branch
with options:
-r
List or delete (if used with -d) the remote-tracking branches.
-a
List both remote-tracking branches and local branches.
Otherwise, examine your .git/config
.