Remote branches in git

I have been using git for a while now, and I believe I have the the basic workflow under control. Committing, reverting, using local branches for major refactoring work: been there, done that! ;) However, I recently got some collaborators on my github-projects, I had to start working with other remote repositories and branches.

I found this blog post, which was really helpful. I am sharing some others things that helped me in the last couple of weeks. Hopefully, this saves other people some time Googling. If you know a better ways to accomplish these tasks, please let me know!

Things to remember about remote branches

Because I had some troubles discovering how to properly work with remote repositories, I am sharing what I found. The most important things to remember:

  • Never forget to switch to the correct local branch (using git checkout local-branch). This is easier if you setup your command prompt to include your current branch.
  • The names of the local and remote do not need to match, but it is highly recommended if you do not want to go crazy ;) .
  • Before you can push changes from a local branch to a remote branch, all the commits of the remote branch have to be included in your local branch. This can be done using by executing git pull remote-name remote-branch in your local branch.

Checking out a newly created branch in a remote repository

Bart is implementing Merb log parsing for request-log-analyzer. He has put his progress in a separate branch of the github project. My local repository does not yet include this branch, but I want to check it out. Note that I am using a different name than the branch name on the github project.

$ git branch merb origin/generic_base
$ git checkout merb

Update: The same can be accomplished with a single command, which sets up remote tracking as well:

$ git checkout -b merb origin/generic_base

When the new functionality is finished, the following commands will merge the changes in the merb branch to the master branch.

  # goto my local master branch and merge the merb-branch
$ git checkout master
$ git merge merb
 
  # push the changes to the master branch on github
$ git push origin master

Merging back a fork

Wes Hays is helping me out on the scoped_search plugin. He implemented OR in the query language in his own fork. I wanted to merge his changes back to master branch:

  # add a reference to the remote repository 
  # and fetch the latest data from that repository
$ git remote add gbdev git://github.com/gbdev/scoped_search.git
$ git fetch gbdev
 
  # create a local branch for the fork to follow a remote branch
$ git branch gbdev-fork gbdev/master
$ git checkout gbdev-fork

Now, my local gbdev-fork branch contains Wes’s code. Because Wes’s repository was forked from my repository, git will know that most of the history of my master branch and gbdev-fork branch is the same.

After some testing, I was ready to include his changes by merging the gbdev-fork branch into my local master branch:

  # go back to my master branch, and merge the changes
$ git checkout master
$ git merge gbdev-fork
  # push the changes to the master branch at hithub
$ git push origin master

Update: I found out that you do not have to create a local branch when merging a remote branch. You can do read-only work directly on the remote branch:

  # Add a new remote to your repository and fetch updates
$ git remote add gbdev git://github.com/gbdev/scoped_search.git
$ git fetch gbdev
 
  # Checkout the remote branch for testing (read-only)
$ git checkout gbdev/master
 
  # After successful testing, merge the branch into the master branch:
$ git checkout master
$ git merge gbdev/master
$ git push origin master

Pushing tags to a remote repository

You can create tags locally, but you probably want to send them to the remot repository as well:

  # create a local tag "tagname" with the given message.
$ git tag -a "tagname" -m "message" 
  # send your tags to the remote repository "origin"
$ git push origin --tags

Deleting tags

Sometimes, you want to remove a faulty tag. If you already pushed your tags to a remote repository, you probably want to delete it from that repository, too,

  # remove local tag
$ git tag -d tagname
  # remove tag from remote using colon syntax
$ git push :tagname

Tags: , , , ,

7 Responses to “Remote branches in git”

  1. Willem van Bergen Says:

    I have written some more recipes for basic git use cases in my newest post.

  2. Bookmarks for 21.03.2009 through 22.03.2009 » mafflog Says:

    [...] Remote branches in git | Floorplanner Tech Blog – [...]

  3. Ken Krugler Says:

    Thanks for the useful info.

    One error in the “Merging back a fork” section. After the “git remote add …” command, you need to do a “git fetch gbdev”. Otherwise the “git branch gbdev-fork gbdev/master” command will give you a typically cryptic error that says “fatal: Not a valid object name: gbdev/master”.

    Or you could use the -f parameter with the git remote add command to do it in one step.

    – Ken

  4. Josh's Blog » Blog Archive » Remote Branches in Git Says:

    [...] Advice on working with remote branches in git, including (most importantly) the two line remote branch checkout – Link [...]

  5. Willem van Bergen Says:

    I have updated this article with some corrections and new insights I have had over the last year. Thanks for the comments!

  6. Yngve I. Levinsen Says:

    Thanks, these kind of tutorials are very useful! Git is definitely very powerful, but I have to say it does take longer to master than svn. At least for me. Then again, most of the time I am learning to do stuff that is anyway impossible with svn, so it isn’t necessarily a bad thing :)

  7. Willem van Bergen Says:

    Git is more complex in nature than svn, so it is expected that mastering it takes some more time, especially if you have to unlearn some of your svn habits. Also, some of the “shortcuts” in the git command line tools actually make it harder to get the concepts.

Leave a Reply