I had occasion to make a patch file the other day, and since I do this so rarely, it took some time to look up how to do it. So here, in a nutshell is how to use diff on a Mac.

Open terminal.
At the prompt, type
diff -up newfile oldfile

But really the easiest way to get the paths right is to type:

diff -up

…then drag first the new file, then the old file from the desktop onto the terminal window right at the end of the line after -up . It will fill in the paths for you.

A complete dictionary of all commands you can use with “diff” are available by typing

diff --help

at the command prompt – and also reproduced below the break.


-i --ignore-case Ignore case differences in file contents.
--ignore-file-name-case Ignore case when comparing file names.
--no-ignore-file-name-case Consider case when comparing file names.
-E --ignore-tab-expansion Ignore changes due to tab expansion.
-b --ignore-space-change Ignore changes in the amount of white space.
-w --ignore-all-space Ignore all white space.
-B --ignore-blank-lines Ignore changes whose lines are all blank.
-I RE --ignore-matching-lines=RE Ignore changes whose lines all match RE.
--strip-trailing-cr Strip trailing carriage return on input.
-a --text Treat all files as text.

-c -C NUM –context[=NUM] Output NUM (default 3) lines of copied context.
-u -U NUM –unified[=NUM] Output NUM (default 3) lines of unified context.
–label LABEL Use LABEL instead of file name.
-p –show-c-function Show which C function each change is in.
-F RE –show-function-line=RE Show the most recent line matching RE.
-q –brief Output only whether files differ.
-e –ed Output an ed script.
–normal Output a normal diff.
-n –rcs Output an RCS format diff.
-y –side-by-side Output in two columns.
-W NUM –width=NUM Output at most NUM (default 130) print columns.
–left-column Output only the left column of common lines.
–suppress-common-lines Do not output common lines.
-D NAME –ifdef=NAME Output merged file to show `#ifdef NAME’ diffs.
–GTYPE-group-format=GFMT Similar, but format GTYPE input groups with GFMT.
–line-format=LFMT Similar, but format all input lines with LFMT.
–LTYPE-line-format=LFMT Similar, but format LTYPE input lines with LFMT.
LTYPE is `old’, `new’, or `unchanged’. GTYPE is LTYPE or `changed’.
GFMT may contain:
%< lines from FILE1
%> lines from FILE2
%= lines common to FILE1 and FILE2
%[-][WIDTH][.[PREC]]{doxX}LETTER printf-style spec for LETTER
LETTERs are as follows for new group, lower case for old group:
F first line number
L last line number
N number of lines = L-F+1
E F-1
M L+1
LFMT may contain:
%L contents of line
%l contents of line, excluding any trailing newline
%[-][WIDTH][.[PREC]]{doxX}n printf-style spec for input line number
Either GFMT or LFMT may contain:
%% %
%c’C’ the single character C
%c’OOO’ the character with octal code OOO

-l –paginate Pass the output through `pr’ to paginate it.
-t –expand-tabs Expand tabs to spaces in output.
-T –initial-tab Make tabs line up by prepending a tab.

-r –recursive Recursively compare any subdirectories found.
-N –new-file Treat absent files as empty.
–unidirectional-new-file Treat absent first files as empty.
-s –report-identical-files Report when two files are the same.
-x PAT –exclude=PAT Exclude files that match PAT.
-X FILE –exclude-from=FILE Exclude files that match any pattern in FILE.
-S FILE –starting-file=FILE Start with FILE when comparing directories.
–from-file=FILE1 Compare FILE1 to all operands. FILE1 can be a directory.
–to-file=FILE2 Compare all operands to FILE2. FILE2 can be a directory.

–horizon-lines=NUM Keep NUM lines of the common prefix and suffix.
-d –minimal Try hard to find a smaller set of changes.
–speed-large-files Assume large files and many scattered small changes.

-v –version Output version info.
–help Output this help.

FILES are `FILE1 FILE2′ or `DIR1 DIR2′ or `DIR FILE…’ or `FILE… DIR’.
If –from-file or –to-file is given, there are no restrictions on FILES.
If a FILE is `-‘, read standard input.