When we run git-diff, git uses its internal diff algorithm to generate diff for changed files.
The git internal diff algorithms
The default diff algorithm used by git-diff is myers diff. However, myers diff algorithm may not generate meaningful diffs for code changes. So the patience diff and histogram diff algorithm is also added later.
This post shows an example where myers diff does not make much sense and patience or histogram diff produce better diffs. It seems that histogram diff generally produces better diff.
To use patience or histogram diff in
git diff, use the following command:
git diff --patience git diff --histogram
aaaaaa aaaaaa bbbbbb bbbbbb cccccc cccccc abc
abc aaaaaa aaaaaa bbbbbb bbbbbb cccccc cccccc
The output of
git diff --patience f1 f2 is:
diff --git a/f1 b/f2 index 3299d68..accc3bd 100644 --- a/f1 +++ b/f2 @@ -1,7 +1,7 @@ -aaaaaa -aaaaaa -bbbbbb -bbbbbb -cccccc -cccccc abc +aaaaaa +aaaaaa +bbbbbb +bbbbbb +cccccc +cccccc
The output of
git diff f1 f2 (remember that myers diff is used by default) is:
diff --git a/f1 b/f2 index 3299d68..accc3bd 100644 --- a/f1 +++ b/f2 @@ -1,7 +1,7 @@ +abc aaaaaa aaaaaa bbbbbb bbbbbb cccccc cccccc -abc
In this case, result of myers diff make much more sense than that of patience diff.
Git external diff tools
Git can also utilize external diff tool via
git difftool command. Note that
git difftool has nothing to do with
git diff (its naming is a bit confusing
since it may make the users believe that git difftool chooses which tool
You can run command
git difftool --tool-help to check a list of supported
external diff tools. To select a certain tool, use
git difftool --tool <my-diff-tool>. For example, to use vimdiff, run
git difftool --tool vimdiff.
- What is the default git diff tool: https://stackoverflow.com/q/63985751/6064933
- Original paper of the myers algorithm: https://citeseerx.ist.psu.edu/viewdoc/summary?doi=10.1.1.4.6927
- patience vs histogram diff: https://stackoverflow.com/q/32365271/6064933
The example compares patience against myers diff, but histogram diff generates the same result as patience diff in this case. ↩︎
License CC BY-NC-ND 4.0