Philip Fourie
Philip Fourie

Reputation: 116827

How do I list all the files in a commit?

How can I print a plain list of all files that were part of a given commit?

Although the following lists the files, it also includes unwanted diff information for each:

git show a303aa90779efdd2f6b9d90693e2cbbbe4613c1d

Upvotes: 3656

Views: 2351026

Answers (30)

Bruce
Bruce

Reputation: 127

If your commit happens to be at the initial HEAD position

git show HEAD@{0}

this should work fine.

Upvotes: 5

seanhodges
seanhodges

Reputation: 17524

A combination of git show --stat and a couple of sed commands should trim the data down for you:

git show --stat <SHA1> | sed -n "/ [\w]\*|/p" | sed "s/|.\*$//"

That will produce just the list of modified files.

Upvotes: 7

Ryan McGeary
Ryan McGeary

Reputation: 239885

Preferred Way (because it's a plumbing command; meant to be programmatic):

$ git diff-tree --no-commit-id --name-only bd61ad98 -r
index.html
javascript/application.js
javascript/ie6.js

Another Way (less preferred for scripts, because it's a porcelain command; meant to be user-facing)

$ git show --pretty="" --name-only bd61ad98    
index.html
javascript/application.js
javascript/ie6.js

  • The --no-commit-id suppresses the commit ID output.
  • The --pretty argument specifies an empty format string to avoid the cruft at the beginning.
  • The --name-only argument shows only the file names that were affected (Thanks Hank). Use --name-status instead, if you want to see what happened to each file (Deleted, Modified, Added)
  • The -r argument is to recurse into sub-trees

Upvotes: 4895

eklektek
eklektek

Reputation: 1173

Perhaps I missed it did anyone mention if you want to augment the log x previous commits using the 'log' command to include the names of the files effected then add --name-only on the end.

so:

git log -n3

to see the last comments of the last 3 commits.

git log -n3 --name-only

to see the comments and files effected in the last 3 commits.

Upvotes: 10

Oleg Kokorin
Oleg Kokorin

Reputation: 2672

git show --name-only a303aa90779efdd2f6b9d90693e2cbbbe4613c1d

Upvotes: 25

Prakash26790
Prakash26790

Reputation: 787

To list the files changed on a particular commit:

git show --pretty=%gd --stat <commit_id>

To list the files changed on recent commit:

git show --pretty=%gd --stat

Upvotes: 39

Piotr Perak
Piotr Perak

Reputation: 11088

I use this to get the list of changed files in a merge commit

λ git log -m -1 --name-only --pretty="format:"
configs/anotherconfig.xml
configs/configsInRepo.xml

or

λ git log -m -1 --name-status --pretty="format:"
A       configs/anotherconfig.xml
M       configs/configsInRepo.xml

Upvotes: 17

Jignesh Joisar
Jignesh Joisar

Reputation: 15085

Try this command for name and changes number of lines

git show --stat <commit-hash>

Only show file names

git show --stat --name-only  <commit-hash>

For getting the last commit hash, try this command:

git log -1

Last commit with show files name and file status modify, create, or delete:

 git log -1 --oneline --name-status <commit-hash>

Or for all

git log

For more advanced git log information, read these articles:

Upvotes: 48

alpha_989
alpha_989

Reputation: 5350

Use

git log --name-status

This will show you the commit id, message, the files changed and whether it was modified, created, added, or deleted. Somewhat of an all-in-one command.

Upvotes: 54

Ijaz Ahmad
Ijaz Ahmad

Reputation: 12100

I found a perfect answer to this:

git show --name-status --oneline <commit-hash>

So that I can know

  • which files were just modified (M)

  • Which files were newly added (A)

  • Which files were deleted (D)

Upvotes: 14

Alireza
Alireza

Reputation: 104640

OK, there are a couple of ways to show all files in a particular commit...

To reduce the information and show only names of the files which committed, you simply can add --name-only or --name-status flag... These flags just show you the file names which are different from previous commits as you want...

So you can do git diff followed by --name-only, with two commit hashes after <sha0> <sha1>. Something like below:

git diff --name-only 5f12f15 kag9f02

I also created the below image to show all steps to go through in these situations:

git diff --name-only 5f12f15 kag9f02

Upvotes: 22

Koen.
Koen.

Reputation: 26939

There's also git whatchanged, which is more low level than git log

NAME
       git-whatchanged - Show logs with difference each commit introduces

It outputs the commit summary with a list of files beneath it with their modes and if they were added(A), deleted(D), or modified(M);

$ git whatchanged f31a441398fb7834fde24c5b0c2974182a431363

Would give something like:

commit f31a441398fb7834fde24c5b0c2974182a431363
Author: xx <[email protected]>
Date:   Tue Sep 29 17:23:22 2015 +0200

    added fb skd and XLForm

:000000 100644 0000000... 90a20d7... A  Pods/Bolts/Bolts/Common/BFCancellationToken.h
:000000 100644 0000000... b5006d0... A  Pods/Bolts/Bolts/Common/BFCancellationToken.m
:000000 100644 0000000... 3e7b711... A  Pods/Bolts/Bolts/Common/BFCancellationTokenRegistration.h
:000000 100644 0000000... 9c8a7ae... A  Pods/Bolts/Bolts/Common/BFCancellationTokenRegistration.m
:000000 100644 0000000... bd6e7a1... A  Pods/Bolts/Bolts/Common/BFCancellationTokenSource.h
:000000 100644 0000000... 947f725... A  Pods/Bolts/Bolts/Common/BFCancellationTokenSource.m
:000000 100644 0000000... cf7dcdf... A  Pods/Bolts/Bolts/Common/BFDefines.h
:000000 100644 0000000... 02af9ba... A  Pods/Bolts/Bolts/Common/BFExecutor.h
:000000 100644 0000000... 292e27c... A  Pods/Bolts/Bolts/Common/BFExecutor.m
:000000 100644 0000000... 827071d... A  Pods/Bolts/Bolts/Common/BFTask.h
...

I know this answer doesn't really match "with no extraneous information.", but I still think this list is more useful than just the filenames.

Upvotes: 18

srcspider
srcspider

Reputation: 11205

There is a simple trick to view as a file listing. Just add : after the hash:

git show 9d3a52c474:

You can then drill in,

git show 9d3a52c474:someDir/someOtherDir

If you hit a file, you'll get the raw version of the file; which sometimes is what you want if you're only looking for a nice reference or key pieces of code (diffs can make everything a mess),

git show 9d3a52c474:someDir/someOtherDir/somefile

The only drawback of this method is that it doesn't easily show a tree of files.

Upvotes: 6

Developer-Sid
Developer-Sid

Reputation: 1382

Use a simple one-line command, if you just want the list of files changed in the last commit:

git diff HEAD~1 --name-only

Upvotes: 20

takeshin
takeshin

Reputation: 50638

I use the changed alias quite often. To set it up:

git config --global alias.changed 'show --pretty="format:" --name-only'

Then:

git changed (lists files modified in last commit)
git changed bAda55 (lists files modified in this commit)
git changed bAda55..ff0021 (lists files modified between those commits)

Similar commands that may be useful:

git log --name-status --oneline (very similar, but shows what actually happened M/C/D)
git show --name-only

Upvotes: 54

Newtonx
Newtonx

Reputation: 3675

List the files that changed in a commit:

git diff --name-only SHA1^ SHA1

This doesn't show log messages, extra newlines, or any other clutter. This works for any commit, not just the current one.

Upvotes: 10

thefreshteapot
thefreshteapot

Reputation: 121

Display the log.

COMMIT can be blank (""), the SHA-1 hash, or a shortened version of the SHA-1 hash.

git log COMMIT -1 --name-only

This will list just the files and is very useful for further processing.

git log COMMIT -1 --name-only --pretty=format:"" | grep "[^\s]"

Upvotes: 10

Vicente Quintans
Vicente Quintans

Reputation: 1416

Using the standard git diff command (also good for scripting):

git diff --name-only <sha>^ <sha>

If you also want the status of the changed files:

git diff --name-status <sha>^ <sha>

This works well with merge commits.

Upvotes: 46

lunohodov
lunohodov

Reputation: 5399

Recently I needed to list all changed files between two commits. So I used this (also *nix specific) command

git show --pretty="format:" --name-only START_COMMIT..END_COMMIT | sort | uniq

Or as Ethan points out:

git diff --name-only START_COMMIT..END_COMMIT

Using --name-status will also include the change (added, modified, deleted, etc.) next to each file:

git diff --name-status START_COMMIT..END_COMMIT

Upvotes: 79

user135507
user135507

Reputation: 169

I use this to get the list of modified files between two changesets:

git diff --name-status <SHA1> <SHA2> | cut -f2

Upvotes: 16

Jakub Narębski
Jakub Narębski

Reputation: 323354

If you want to get the list of changed files:

git diff-tree --no-commit-id --name-only -r <commit-ish>

If you want to get the list of all files in a commit, you can use

git ls-tree --name-only -r <commit-ish>

Upvotes: 371

Hank Gay
Hank Gay

Reputation: 71939

I'll just assume that gitk is not desired for this. In that case, try git show --name-only <sha>.

Upvotes: 324

user2394284
user2394284

Reputation: 6018

Only the file list (not even commit message):

git show --name-only --pretty=format:

E.g. open all changed files in your editor:

git show --name-only --pretty=format: | xargs "$EDITOR"

Upvotes: 9

Mendi Barel
Mendi Barel

Reputation: 3677

List all files in a commit tree:

git ls-tree --name-only --full-tree a21e610

Upvotes: 3

Tuxdude
Tuxdude

Reputation: 49473

I personally use the combination of --stat and --oneline with the show command:

git show --stat --oneline HEAD
git show --stat --oneline b24f5fb
git show --stat --oneline HEAD^^..HEAD

If you do not like/want the addition/removal stats, you can replace --stat with --name-only

git show --name-only --oneline HEAD
git show --name-only --oneline b24f5fb
git show --name-only --oneline HEAD^^..HEAD

Upvotes: 279

VaTo
VaTo

Reputation: 3078

Simplest form:

git show --stat (hash)

That's easier to remember and it will give you all the information you need.

If you really want only the names of the files you could add the --name-only option.

git show --stat --name-only (hash)

Upvotes: 74

Indu Devanath
Indu Devanath

Reputation: 2188

You can also do

git log --name-only

and you can browse through various commits, commit messages and the changed files.

Type q to get your prompt back.

Upvotes: 141

Michael De Silva
Michael De Silva

Reputation: 3818

I like to use

git show --stat <SHA1>^..<SHA2>

Upvotes: 15

skiphoppy
skiphoppy

Reputation: 102713

I like this:

git diff --name-status <SHA1> <SHA1>^

Upvotes: 13

Pat Notz
Pat Notz

Reputation: 214176

$ git log 88ee8^..88ee8 --name-only --pretty="format:"

Upvotes: 28

Related Questions