Raif
Raif

Reputation: 9249

Get all files that have been modified in git branch

Is there a way to see what files have changed in a branch?

Upvotes: 380

Views: 266961

Answers (17)

HARISH ARORA
HARISH ARORA

Reputation: 47

What about

git diff --name-only HEAD~1

Upvotes: 3

exussum
exussum

Reputation: 18550

amazed this has not been said so far!

git diff main...branch

So see the changes only on branch

To check the current branch use

git diff main...

Thanks to jqr

This is short hand for

git diff $(git merge-base main branch) branch

so the merge base (the most recent common commit between the branches) and the branch tip

Also using origin/main instead of just master will help in case your local main is dated

Upvotes: 129

c69
c69

Reputation: 21487

Update Nov 2020:

To get the list of files modified (and committed!) in the current branch you can use the shortest console command using standard :

git diff --name-only master...


  • If your local "master" branch is outdated (behind the remote), add a remote name (assuming it is "origin"):

    git diff --name-only origin/master...

  • If you want to include uncommitted changes as well, remove the ...:

    git diff --name-only master

  • If you use different main branch name (eg: "main"), substitute it:

    git diff --name-only main...

  • If your want to output to stdout (so its copyable):

    git diff --name-only master... | cat

  • If your want filenames to be clickable in VSCode terminal no matter what folder you are running this command from, add --relative:

    git diff --name-only --relative master... | cat


per really nice detailed explanation of different options https://blog.jpalardy.com/posts/git-how-to-find-modified-files-on-a-branch/

Upvotes: 39

Leniel Maccaferri
Leniel Maccaferri

Reputation: 102368

Considering you're on a feature branch and you want to check which files have changed compared to master... just this:

git diff --name-only master

Upvotes: 3

okainov
okainov

Reputation: 4658

For some reason no one mentioned git-tree. See https://stackoverflow.com/a/424142/1657819

git-tree is preferred because it's a plumbing command; meant to be programmatic (and, presumably, faster)

(assuming base branch is master)

git diff-tree --no-commit-id --name-only -r master..branch-name

However this will show you all files which were affected in the branch, if you want to see explicitly modified files only, you can use --diff-filter:

git diff-tree --no-commit-id --name-only -r master..branch-name --diff-filter=M

Also one can use --name-status instead of --name-only to see the status of the files (A/M/D and so on)

Upvotes: 4

Rajesh Dusa
Rajesh Dusa

Reputation: 201

git diff --name-only master...branch-name

to which we want to compare.

Upvotes: 20

Connor Clark
Connor Clark

Reputation: 696

The accepted answer - git diff --name-only <notMainDev> $(git merge-base <notMainDev> <mainDev>) - is very close, but I noticed that it got the status wrong for deletions. I added a file in a branch, and yet this command (using --name-status) gave the file I deleted "A" status and the file I added "D" status.

I had to use this command instead:

git diff --name-only $(git merge-base <notMainDev> <mainDev>)

Upvotes: 2

T04435
T04435

Reputation: 13992

I use grep so I only get the lines with diff --git which are the files path:

git diff branchA branchB | grep 'diff --git'
// OUTPUTS ALL FILES WITH CHANGES, SIMPLE HA :)
diff --git a/package-lock.json b/package-lock.json

Upvotes: 1

Yep_It&#39;s_Me
Yep_It&#39;s_Me

Reputation: 4801

I really liked @twalberg's answer but I didn't want to have to type the current branch name all the time. So I'm using this:

git diff --name-only $(git merge-base master HEAD)

Upvotes: 33

Steve Chambers
Steve Chambers

Reputation: 39384

The following batch file is based on twalberg's answer but will work in Windows:

@ECHO OFF
C:                               :: <== OR USE A DIFFERENT DRIVE
CD \path\to\where\git\files\are  :: <== CHANGE TO THE ACTUAL PATH
SET /p b="Enter full path of an ALREADY MERGED branch to compare with origin/master: "
bash --login -i -c "git diff --name-only %b% $(git merge-base %b1% origin/drop2/master)"
PAUSE

The above assumes that the main branch is origin/master and that git bash was included when Git was installed (and its location is in the path environment). I actually needed to show the actual differences using a configured diff tool (kdiff3) so substituted the following bash command above:

bash --login -i -c "git difftool --dir-diff %b% $(git merge-base %b1% origin/drop2/master)"

Upvotes: 0

lukiller
lukiller

Reputation: 1207

I can't believe there are so many ways to do this. I use whatchanged as someone posted before, just with the following arguments:

git whatchanged --name-only --pretty="" origin..HEAD

This just lists the filenames, and only the ones that changed on the current branch.

Upvotes: 83

chalasr
chalasr

Reputation: 13167

git whatchanged seems to be a good alternative.

Upvotes: 15

Lunyx
Lunyx

Reputation: 3284

Expanding off of what @twalberg and @iconoclast had, if you're using cmd for whatever reason, you can use:

FOR /F "usebackq" %x IN (`"git branch | grep '*' | cut -f2 -d' '"`) DO FOR /F "usebackq" %y IN (`"git merge-base %x master"`) DO git diff --name-only %x %y

Upvotes: 0

iconoclast
iconoclast

Reputation: 22610

What if it could be as easy as this?

git changed

If you're willing to assume that the main branch is called "master", and that you create your other branches from master, then you can add this alias to your ~/.gitconfig file to make it that easy:

cbranch = !"git branch | grep '*' | cut -f2 -d' '"
changed = !"git diff --name-only $(git cbranch) $(git merge-base $(git cbranch) master)"

Those assumptions will work for most people in most situations, but you must be aware that you're making them.

Also, you must use a shell that supports $(). It's very likely that your shell supports this.

Upvotes: 8

Badari
Badari

Reputation: 83

git show --stat origin/branch_name

This will give you a list of the files that have been added or modified under this branch.

Upvotes: 1

twalberg
twalberg

Reputation: 62369

An alternative to the answer by @Marco Ponti, and avoiding the checkout:

git diff --name-only <notMainDev> $(git merge-base <notMainDev> <mainDev>)

If your particular shell doesn't understand the $() construct, use back-ticks instead.

Upvotes: 275

Marco Ponti
Marco Ponti

Reputation: 2669

All you have to do is the following:

git checkout <notMainDev>
git diff --name-only <mainDev>

This will show you only the filenames that are different between the two branches.

Upvotes: 243

Related Questions