Unified diffs pack a lot of useful information into a small space and are worth learning to read. Here’s a diff (from git diff
) which we’ll then unpack.
diff --git a/pset1/test020.c b/pset1/test020.c
index 0f59130..42e0ca5 100644
--- a/pset1/test020.c
+++ b/pset1/test020.c
@@ -2,7 +2,7 @@
#include <stdio.h>
#include <assert.h>
#include <string.h>
-// test020: check for wild writes off the end of the allocated block.
+// test020: check for boundary write errors off the end of an allocated block.
int main() {
int *ptr = (int *) malloc(sizeof(int) * 10);
Each diff compares two files. We could call them the previous version and the current version, but it’s in some ways more useful to think of them as the left version and the right version.
- For
diff -u FILE1 FILE2
,FILE1
is the left version andFILE2
is the right version. - For
git diff
, the current version in the version repository is the left version and the working copy is the right version. (Actually, the left version also includes changes in the staging area.) - For
git diff COMMIT
,COMMIT
is the left version and the working copy is the right version. - For
git diff COMMIT1 COMMIT2
,COMMIT1
is the left version andCOMMIT2
is the right version.
Unified diffs use -
characters for the left version and +
characters for the right version. It is common to use red
for the left version and green
for the right version, and your git diff
may actually generate output colored this way by default.
Each diff’s header reports the left and right files. Since git diff
compares two versions of the same file, rather than different files, it reports the filename prefixed with “a/
” for the left file and “b/
” for the right.
Diffs produced by git also report the left and right commit hashes.
Following a diff header are one or more diff sections, set off by @@
signs. A diff section shows a region of changes. Diff tries to report small, isolated sections when possible; if you change the first and last lines in a file, diff will report two sections, one at the beginning and one at the end. If you change every line in a file, though, you’ll get one huge section.
Each section header reports the first line number in the section. It gives a line number for both the left version and the right version, since one version might have different line numbers than the other.
Note that the -
and +
signs refer to versions, not, like, “line negative two.” The “,7
”s mean that this section shows 7 lines of code for each version; if a section contains more lines for one version than for the other, these numbers will differ.
Finally, the meat of the diff consists of lines of text. Lines only in the left version start with -
; lines only in the right version start with +
. Lines in both versions start with a space. They’re provided for context to make the diff easier to read.
Putting it all together:
Options
- Use
git diff -b
to hide diffs that only change the amount of whitespace in a line. - Use
git diff -U
N
to getN
lines of context per diff rather than three.