When using Git, I often find myself doing the following when working in master
:
# work work work...
$ git checkout -b temp
$ git commit -a -m 'more work done'
$ git checkout master
$ git pull origin master
# turns out master was updated since my previous pull
$ git checkout temp
# I don't want a merge commit for a simple bugfix
$ git rebase master
$ git checkout master
$ git merge temp
$ git push origin master
$ git branch -d temp
... and I get tired of doing this. Is there a way to do this dance without all of the checkouts, and preferably without (manually) creating the temporary branch?
If you don't mind not creating a branch called temp
, you could just do the following all on master
:
git commit -a -m 'more work done'
git fetch origin
git rebase origin/master
... or equivalently:
git commit -a -m 'more work done'
git pull --rebase origin master
If you do want to keep the temp
branch, however, you can still make this a bit shorter by not checking out master
just to do the pull
- you only need to fetch
and then rebase your branch onto origin/master
:
# work work work...
$ git checkout -b temp
$ git commit -a -m 'more work done'
$ git fetch origin
# It looks like origin/master was updated, so:
$ git rebase origin/master
# Then when you finally want to merge:
$ git checkout master
$ git merge temp
$ git push origin master
$ git branch -d temp
sehe's answer reminds me that you could replace:
$ git fetch origin
$ git rebase origin/master
... with:
$ git pull --rebase origin master
... which is nearly equivalent. The difference is that when you run git fetch origin
, all of your remote-tracking branches for origin
will be updated, whereas when you pull a particular branch from origin
, none of them are - it's just the temporary ref FETCH_HEAD
that is updated. I personally prefer running one extra command (git fetch origin
), and seeing all the remote branches that have changed in the output.
You can at least optimize the rebasing: git pull --rebase
I'm not exactly sure how you like things, but I like my workflow sort of like this:
git checkout -b temp
git commit -a -m 'more work done'
git pull --rebase origin master
That way I keep my focus on the branch at hand.
Then later, I do
git checkout master
git pull origin master
git merge temp
etc.