Is it possible to get git to produce a diff between a specific file as it exists now, and as it existed before the last commit that changed it?
That is, if we know:
$ git log --oneline myfile
123abc Fix some stuff
456def Frobble the foos
789dba Initial commit
Then git diff 456def myfile
shows the last change to myfile. Is is possible to do the same without the knowledge produced by the git log
; what changed in 123abc?
One of the ways to use git diff is:
And a common way to refer one commit of the last commit is as a relative path to the actual HEAD. You can reference previous commits as HEAD^ (in your example this will be 123abc) or HEAD^^ (456def in your example), etc ...
So the answer to your question is:
This does exist, but it's actually a feature of
git log
:Note that
-p
can also be used to show the inline diff from a single commit:Options used:
-p
(also-u
or--patch
) is hidden deeeeeeeep in thegit-log
man page, and is actually a display option forgit-diff
. When used withlog
, it shows the patch that would be generated for each commit, along with the commit information—and hides commits that do not touch the specified<path>
. (This behavior is described in the paragraph on--full-diff
, which causes the full diff of each commit to be shown.)-1
shows just the most recent change to the specified file (-n 1
can be used instead of-1
); otherwise, all non-zero diffs of that file are shown.--follow
is required to see changes that occurred prior to a rename.As far as I can tell, this is the only way to immediately see the last set of changes made to a file without using
git log
(or similar) to either count the number of intervening revisions or determine the hash of the commit.To see older revisions changes, just scroll through the log, or specify a commit or tag from which to start the log. (Of course, specifying a commit or tag returns you to the original problem of figuring out what the correct commit or tag is.)
Credit where credit is due:
log -p
thanks to this answer.--follow
option.-n 1
option and atatko for mentioning the-1
variant.-p
"means" semantically.If you are fine using a graphical tool this works very well:
gitk now shows all commits where the file has been updated. Marking a commit will show you the diff against the previous commit in the list. This also works for directories, but then you also get to select the file to diff for the selected commit. Super useful!