I’ve been using
git for quite a while now and some of it’s features continue
to amaze me. Here’s a few things I learned recently.
When you’ve made a change against a
master that’s moving often, you find that
git diff master doesn’t give the right diff. It shows you the
difference between your branch and current
master. That’s not what you want
in most cases. The
master branch would have changed and now the command also
shows those changes. GitHub does the right thing and the right command in this
case is the following:
git diff master...
Recently, our designer Sam Smith started working on making CKAN more responsive. His Branch was based off master and I wanted to make a new branch based off release-v2.2 with his changes on top of it. My instinct was to make a patch.
git diff master...responsive > ../responsive.patch
Then, apply the patch onto a different branch. This would surely work, but I’m using a version control system! It should be smart about this. The good folks in #git pointed me in the right direction.
First find the last commit from the responsive branch that you don’t want to copy.
git checkout responsive git log master..responsive
The last commit in that log is what you want to copy. In this case, it’s
7587c6e8fe49c809ef7357b6f88496bd06ac93b9, so now you want to do
7587c6e8fe49c809ef7357b6f88496bd06ac93b9^. The first commit is the one you
don’t want to keep.
git checkout responsive git checkout -b reponsive-2.2 git rebase 7587c6e8fe49c809ef7357b6f88496bd06ac93b9 --onto release-2.2
Thus, responsive-2.2 is a new branch with responsive changes based on top of release-v2.2!