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.
Finding only your changes to master.
When you’ve made a change against a
master that’s moving often, you find that simply doing
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...
Copying your changes in one branch into another
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
git log 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!