-
Getting a diff between the working tree and other commits
I’ve previously written about how to get the diffs between your working tree, the index and the last commit. But you frequently need to see the difference between the code you’re working on and previous commits.
Here’s a diagram that summarises the commands:

If you’ve read the previous article then this should make sense I’ve used
HEAD~to represent the parent of the tip of the branch you’re working on, but this can be replaced with the any of the other methods of referring to commits specified in the gitrevisions documentation.However, when doing this, you usually only want to see changes between specific files. For this you can optionally pass in the paths that you want the diff between after a pair of dashes
--. If you leave out the paths you’ll get the complete diff.git diff --cached HEAD~ -- somefile.py
This will show the difference between the version ofsomefile.pyin the index and the version inHEAD~git diff HEAD~ -- somefile.py
This will show the difference between the version ofsomefile.pyin the working tree and the version inHEAD~.
If you are using an external viewer such as Changes or Kaleidoscope (for the Mac) or other tools for other platforms. These usually come with instructions for setting them up and calling them using the
git difftoolcommand rather thangit diff. The good news is that the options and parameters are the same so you can still get pretty diffs with the same control.Posted on February 23, 2011 with 14 notes ()
-
What’s the difference? Part 1
This is one that used to catch me out when I first started using Git. I’d make some changes, add things to the index and then try and get a diff by calling
git diffand nothing would come up.Of course, git wants to know what I want a diff between. If you remember yesterday’s post about the buckets there are three types of diff that you can get.

If you’re new to git you may be asking “What’s this HEAD thing?” HEAD (or head) is a reference to the tip of the branch that you are on. It’s the last commit that the code you’re working on will be changing.
So there are three types of diff you can ask for:
git diff --cachedThis is the difference between what is in the index and the last commit. It shows you that changes that will be in the next commit.git diffThis shows the difference in between the index and the working tree. These are the changes that you have made to files since you last added them to the index. This is why I wasn’t getting any results. I had no changes between the index and the working tree.git diff headThis shows the difference between the files in the working tree and the last commit. There is a gotcha here: if you’ve made changes, added them to the index, and then backed out these changes in the working tree, you’ll get no results forgit diff HEAD(because there is no difference) but you will get output forgit diff --cachedbecause there are still changes in the index.
The eagle-eyed amongst you will have noticed that in the third option I am diffing against a reference to a commit (HEAD). In this case it happens to be the the last commit. Can you use references to different commits to get a wider diff? Yes you can. But I’ve got 365 days to fill so I’m going to leave that to Part 2, some time in the future.
Posted on March 26, 2010 with 1 note ()