I know how to make a new branch that tracks remote branches. But how do I make an existing branch track a remote branch. I know I can just edit the .git/config file, but it seems there should be an easier way.
It looks like this can't currently be done in a convenient way with the current (1.6.1.x) version of Git.
Git version >= 1.7.0 supports this. See the accepted answer.
improve this question
In very short
git branch --set-upstream **yourLoacalBranchName** origin/**develop**
This will make your yourLoacalBranchName track the remote branch called develop
I do this as a side-effect of pushing with the -u option as in
$ git push -u origin branch-name
The equivalent long option is --set-upstream.
The git-branch command also understands --set-upstream, but its use can be confusing. Version 1.8.0 modifies the interface.
git branch --set-upstream is deprecated and may be removed in a relatively distant future. git branch [-u|--set-upstream-to] has been introduced with a saner order of arguments.
It was tempting to say git branch --set-upstream origin/master, but that tells Git to arrange the local branch "origin/master" to integrate with the currently checked out branch, which is highly unlikely what the user meant. The option is deprecated; use the new --set-upstream-to (with a short-and-sweet -u) option instead.
Say you have a local foo branch and want it to treat the branch by the same name as its upstream. Make this happen with
$ git branch foo
$ git branch --set-upstream-to=origin/foo
$ git branch --set-upstream-to=origin/foo foo
Given a branch foo and a remote upstream:
As of Git 1.8.0:
git branch -u upstream/foo
Or, if local branch foo is not the current branch:
git branch -u upstream/foo foo
Or, if you like to type longer commands, these are equivalent to the above two:
git branch --set-upstream-to=upstream/foo
git branch --set-upstream-to=upstream/foo foo
As of Git 1.7.0:
git branch --set-upstream foo upstream/foo
All of the above commands will cause local branch foo to track remote branch foo from remote upstream. The old (1.7.x) syntax is deprecated in favor of the new (1.8+) syntax. The new syntax is intended to be more intuitive and easier to remember.
See also: Git: Why do I need to do `--set-upstream` all the time?
You can do the following (assuming you are checked out on master and want to push to a remote branch master):
Set up the 'remote' if you don't have it already
# git remote add origin ssh://...
Now configure master to know to track:
# git config branch.master.remote origin
# git config branch.master.merge refs/heads/master
# git push origin master
You might find the git_remote_branch tool useful. It offers simple commands for creating, publishing, deleting, tracking & renaming remote branches. One nice feature is that you can ask a grb command to explain what git commands it would execute.
$ grb explain create my_branch github
# git_remote_branch version 0.3.0
# List of operations to do to create a new remote branch and track it locally:
git push github master:refs/heads/my_branch
git fetch github
git branch --track my_branch github/my_branch
git checkout my_branch
For 1.6.x, it can be done using the git_remote_branch tool:
grb track foo upstream
That will cause Git to make foo track upstream/foo.
I believe that in as early as Git 1.5.x you could make a local branch $BRANCH track a remote branch origin/$BRANCH, like this.
Given that $BRANCH and origin/$BRANCH exist, and you've not currently checked out $BRANCH (switch away if you have), do:
git branch -f --track $BRANCH origin/$BRANCH
This recreates $BRANCH as a tracking branch. The -f forces the creation despite $BRANCH existing already. --track is optional if the usual defaults are in place (that is, the git-config parameter branch.autosetupmerge is true).
Note, if origin/$BRANCH doesn't exist yet, you can create it by pushing your local $BRANCH into the remote repository with:
git push origin $BRANCH
Followed by the previous command to promote the local branch into a tracking branch.
Actually for the accepted answer to work:
$ git remote add upstream git://...../proj.git
$ git fetch upstream
$ git branch -f --track qa upstream/qa
$ git branch --set-upstream qa upstream/qa
Make sure you run :
git config push.default tracking
to be able to push trouble free
Editing .git/config is probably the easiest and fastest way. That's what the Git commands for handling remote branches are doing, anyway.
If you don't want to muck with the file by hand (and it's not that hard to do), you can always use git config to do it...but again, that's just going to edit the .git/config file, anyway.
There are, of course, ways to automatically track a remote branch when using git checkout (by passing the --track flag, for example), but these commands work with new branches, not existing ones.