| diff-highlight | |
| ============== | |
| Line oriented diffs are great for reviewing code, because for most | |
| hunks, you want to see the old and the new segments of code next to each | |
| other. Sometimes, though, when an old line and a new line are very | |
| similar, it's hard to immediately see the difference. | |
| You can use "--color-words" to highlight only the changed portions of | |
| lines. However, this can often be hard to read for code, as it loses | |
| the line structure, and you end up with oddly formatted bits. | |
| Instead, this script post-processes the line-oriented diff, finds pairs | |
| of lines, and highlights the differing segments. It's currently very | |
| simple and stupid about doing these tasks. In particular: | |
| 1. It will only highlight a pair of lines if they are the only two | |
| lines in a hunk. It could instead try to match up "before" and | |
| "after" lines for a given hunk into pairs of similar lines. | |
| However, this may end up visually distracting, as the paired | |
| lines would have other highlighted lines in between them. And in | |
| practice, the lines which most need attention called to their | |
| small, hard-to-see changes are touching only a single line. | |
| 2. It will find the common prefix and suffix of two lines, and | |
| consider everything in the middle to be "different". It could | |
| instead do a real diff of the characters between the two lines and | |
| find common subsequences. However, the point of the highlight is to | |
| call attention to a certain area. Even if some small subset of the | |
| highlighted area actually didn't change, that's OK. In practice it | |
| ends up being more readable to just have a single blob on the line | |
| showing the interesting bit. | |
| The goal of the script is therefore not to be exact about highlighting | |
| changes, but to call attention to areas of interest without being | |
| visually distracting. Non-diff lines and existing diff coloration is | |
| preserved; the intent is that the output should look exactly the same as | |
| the input, except for the occasional highlight. | |
| Use | |
| --- | |
| You can try out the diff-highlight program with: | |
| --------------------------------------------- | |
| git log -p --color | /path/to/diff-highlight | |
| --------------------------------------------- | |
| If you want to use it all the time, drop it in your $PATH and put the | |
| following in your git configuration: | |
| --------------------------------------------- | |
| [pager] | |
| log = diff-highlight | less | |
| show = diff-highlight | less | |
| diff = diff-highlight | less | |
| --------------------------------------------- |