Easy Way to Extract Files From a Commit
If you use Git every day, you probably make a lot of commits. If you're using Git every day in a project with other people, it's safe to assume that everyone is making lots of commits. Every day. And this means you're aware of how disorienting a Git log can become, with a seemingly eternal scroll of changes and no sign of what's been changed.
So how do you find out what file changed in a specific commit? It's easier than you think.
Find what file changed in a commit
To find out which files changed in a given commit, use the git log --raw
command. It's the fastest and simplest way to get insight into which files a commit affects. The git log
command is underutilized in general, largely because it has so many formatting options, and many users get overwhelmed by too many choices and, in some cases, unclear documentation.
The log mechanism in Git is surprisingly flexible, though, and the --raw
option provides a log of commits in your current branch, plus a list of each file that had changes made to it.
Here's the output of a standard git log
:
$ git log
commit fbbbe083aed75b24f2c77b1825ecab10def0953c (HEAD -> dev, origin/dev)
Author: tux <tux@example.com>
Date: Sun Nov 5 21:40:37 2020 +1300exit immediately from failed download
commit 094f9948cd995acfc331a6965032ea0d38e01f03 (origin/master, master)
Author: Tux <tux@example.com>
Date: Fri Aug 5 02:05:19 2020 +1200export makeopts from etc/example.conf
commit 76b7b46dc53ec13316abb49cc7b37914215acd47
Author: Tux <tux@example.com>
Date: Sun Jul 31 21:45:24 2020 +1200fix typo in help message
Even when the author helpfully specifies in the commit message which files changed, the log is fairly terse.
Here's the output of git log --raw
:
$ git log --raw
commit fbbbe083aed75b24f2c77b1825ecab10def0953c (HEAD -> dev, origin/dev)
Author: tux <tux@example.com>
Date: Sun Nov 5 21:40:37 2020 +1300exit immediately from failed download
:100755 100755 cbcf1f3 4cac92f M src/example.lua
commit 094f9948cd995acfc331a6965032ea0d38e01f03 (origin/master, master)
Author: Tux <tux@example.com>
Date: Fri Aug 5 02:05:19 2020 +1200export makeopts from etc/example.conf
:100755 100755 4c815c0 cbcf1f3 M src/example.lua
:100755 100755 71653e1 8f5d5a6 M src/example.spec
:100644 100644 9d21a6f e33caba R100 etc/example.conf etc/example.conf-defaultcommit 76b7b46dc53ec13316abb49cc7b37914215acd47
Author: Tux <tux@example.com>
Date: Sun Jul 31 21:45:24 2020 +1200fix typo in help message
:100755 100755 e253aaf 4c815c0 M src/example.lua
This tells you exactly which file was added to the commit and how the file was changed (A
for added, M
for modified, R
for renamed, and D
for deleted).
Git whatchanged
The git whatchanged
command is a legacy command that predates the log function. Its documentation says you're not meant to use it in favor of git log --raw
and implies it's essentially deprecated. However, I still find it a useful shortcut to (mostly) the same output (although merge commits are excluded), and I anticipate creating an alias for it should it ever be removed. If you don't need to merge commits in your log (and you probably don't, if you're only looking to see files that changed), try git whatchanged
as an easy mnemonic.
View changes
Not only can you see which files changed, but you can also make git log
display exactly what changed in the files. Your Git log can produce an inline diff, a line-by-line display of all changes for each file, with the --patch
option:
commit 62a2daf8411eccbec0af69e4736a0fcf0a469ab1 (HEAD -> master)
Author: Tux <Tux@example.com>
Date: Wed Mar 10 06:46:58 2021 +1300commit
diff --git a/hello.txt b/hello.txt
index 65a56c3..36a0a7d 100644
--- a/hello.txt
+++ b/hello.txt
@@ -1,2 +1,2 @@
Hello
-world
+opensource.com
In this example, the one-word line "world" was removed from hello.txt
and the new line "opensource.com" was added.
These patches can be used with common Unix utilities like diff and patch, should you need to make the same changes manually elsewhere. The patches are also a good way to summarize the important parts of what new information a specific commit introduces. This is an invaluable overview when you've introduced a bug during a sprint. To find the cause of the error faster, you can ignore the parts of a file that didn't change and review just the new code.
Simple commands for complex results
You don't have to understand refs and branches and commit hashes to view what files changed in a commit. Your Git log was designed to report Git activity to you, and if you want to format it in a specific way or extract specific information, it's often a matter of wading through many screens of documentation to put together the right command. Luckily, one of the most common requests about Git history is available with just one or two options: --raw
and --patch
. And if you can't remember --raw
, just think, "Git, what changed?" and type git whatchanged
.
This work is licensed under a Creative Commons Attribution-Share Alike 4.0 International License.
Source: https://opensource.com/article/21/4/git-whatchanged