git rebase onto remote updates

Blake Chambers picture Blake Chambers · May 26, 2010 · Viewed 17.5k times · Source

I work with a small team that uses git for source code management. Recently, we have been doing topic branches to keep track of features then merging them into master locally then pushing them to a central git repository on a remote server. This works great when no changes have been made in master: I create my topic branch, commit it, merge it into master, then push. Hooray.

However, if someone has pushed to origin before I do, my commits are not fast-forward. Thus a merge commit ensues. This also happens when a topic branch needs to merge with master locally to ensure my changes work with the code as of now. So, we end up with merge commits everywhere and a git log rivaling a friendship bracelet.

So, rebasing is the obvious choice. What I would like is to:

  • create topic branches holding several commits
  • checkout master and pull (fast-forward because i haven't committed to master)
  • rebase topic branches onto the new head of master
  • rebase topics against master(so the topics start at masters head), bringing master up to my topic head

My way of doing this currently is listed below:

git checkout master
git rebase master topic_1
git rebase topic_1 topic_2
git checkout master
git rebase topic_2
git branch -d topic_1 topic_2

Is there a faster way to do this?

Answer

Martin Owen picture Martin Owen · Dec 17, 2010

Do you know about git pull --rebase? It rebases rather than merging when you pull, and prevents merge commits from polluting your history.

You can also set it up as the default behaviour for a branch with the branch.<name>.rebase and branch.autosetuprebase config options.