Showing which files have changed between two revisions
Asked Answered
T

21

2355

I want to merge two branches that have been separated for a while and wanted to know which files have been modified.

Came across this link: http://linux.yyz.us/git-howto.html (moved to web.archive.org) which was quite useful.

The tools to compare branches I've come across are:

  • git diff master..branch
  • git log master..branch
  • git shortlog master..branch

Was wondering if there's something like "git status master..branch" to only see those files that are different between the two branches.

Without creating a new tool, I think this is the closest you can get to do that now (which of course will show repeats if a file was modified more than once):

  • git diff master..branch | grep "^diff"

Was wondering if there's something I missed...

Tetrapterous answered 5/5, 2009 at 0:47 Comment(7)
How many others find the title of this question misleading? It is actually about finding the file differences between two branches. What I came here looking for was how to see file differences between two revisions on the same branch. Or am I the only one?Appoint
@SandeepanNath: with git there is no difference. You are ALWAYS referring to individual commits.Cidevant
@SamuelO'Malley I am new to git and considering the seemingly common branching strategy wherein all the branches are finally merged to the master branch and ultimately the master is rolled out. Now, considering the event of a rollout, where the production is already at master, but behind the tip (by one revision if the last rollout happened after the last master merge), I would like to see the differences between these two revisions, to find out what would be rolled out. I would not like to look at the branch which was last merged. Correct me if I am wrong.Appoint
@SandeepanNath: instead of using the branch names then you can take the answers below and just specify the commit IDs instead. Or even refer the commits by their tag names if you create tags when rolling out.Cidevant
@SandeepanNath You cannot compare 2 branches, you must specify the revision. So comparing 2 branches is comparing 2 revisions.Sprayberry
You can give tags on different commits of the same branch, or commit hashes. $: git diff --name-status f5355424206..c755066b097 is pretty specific. :)Vocalize
@SandeepanNath think of a branch name as just an alias for the last commit on that branch (aka HEAD)Coz
E
2908

To compare the current branch against main branch:

$ git diff --name-status main

To compare any two branches:

$ git diff --name-status firstbranch..yourBranchName

There is more options to git diff in the official documentation (and specifically --name-status option).

Ermine answered 5/5, 2009 at 1:4 Comment(18)
What's do each of the indices on the left hand side mean (I see a lot of M's and D's)?Wowser
@user446936 - you can see what the letters mean in the git status man page @ kernel.org/pub/software/scm/git/docs/git-status.html - in particular, M == modified, D == deletedIndihar
The same syntax works for comparing a branch with a tag or a tag with another tag.Borries
git diff --name-status your_branch...master outputs the changes that occurred on master since your_branch was created from itMolotov
The double-dot operator is superfluous, here, because diffs are pairwise.Highline
I get unknown revision or path not in the working tree.Hyatt
Don't forget to use all three (3) hypens (aka dashes)! Yup, git likes hyphens.Blotchy
AFAIK, if you run the command and then nothing happens ie no lines are created, it means that there is no difference.Slipover
Downvoted, fatal: bad revision 'master..branchName' Obviously if git command is obscure to use, and most are, answering requires lot more than just post random code snippet.Compline
You can actually do better than that if your working directory is the compared branch: git diff --name-status masterRouleau
If any of the 2 branches are not present locally, you will have an error like fatal: ambiguous argument '1stBranch..2ndBranch': unknown revision or path not in the working tree.. Checkout the branches to solve this: git checkout 1stBranch & git checkout 2ndBranchEx
How to skip warnings?Madera
How to do this without any text being printed? So the main question is how to say that name_x and name_y are pointing to the very same hash?Morelock
It worth to mention '--name-only' option. It provide information only about the names of the files that changed, without status-codes. If might be more helpful in some scripts.Colza
you may also filter only Modified(M) or Deleted(D) files. using --diff-filter=(A|C|D|M|R|T|U|X|B)Marcela
To compare the main branch with your current working directory you omit the branch name and use two dots. For example, git diff ..main shows changes that need to be made from the main branch to get to the code in my working directory.Smalto
git diff --name-status Rel_Branch..Dev_BranchTreat
You may use --pretty='' in order to get rid of commit messages between file paths like in this answerMezzorelievo
S
443

Try

$ git diff --stat --color master..branchName

This will give you more info about each change, while still using the same number of lines.

You can also flip the branches to get an even clearer picture of the difference if you were to merge the other way:

$ git diff --stat --color branchName..master
Singlet answered 9/2, 2011 at 19:38 Comment(4)
If you have (highly recommended, imho) git color turned on (config --global color.ui true), you can skip the --color. (I have lks - lazy keyboard syndrome.)Danuloff
I'm with you on color! BTW I meant to say git config --global color.ui true - to be complete.Danuloff
Does not work, throws errors: fatal: ambiguous argument 'master..branchName': unknown revision or path not in the working tree.Compline
@TomášZato sorry but you need to swap "branchName" with the name of your branch.Singlet
G
172

Also keep in mind that git has cheap and easy branching. If I think a merge could be problematic I create a branch for the merge. So if master has the changes I want to merge in and ba is my branch that needs the code from master I might do the following:

git checkout ba
git checkout -b ba-merge
git merge master
.... review new code and fix conflicts....
git commit
git checkout ba
git merge ba-merge
git branch -d ba-merge
git merge master

End result is that I got to try out the merge on a throw-away branch before screwing with my branch. If I get my self tangled up I can just delete the ba-merge branch and start over.

Gristede answered 11/10, 2012 at 1:22 Comment(8)
Awesome. I have never thought of branching that way. I think this should be considered as part of the "best practices" when merging.Condole
When you merge the ba-marge back into ba, isn't there a potential to have to fix the conflicts again?Smidgen
@EricAnderson Right, it's a graph. SVN sticks like gum under a school desk. thx.Smidgen
Why do you need to do last step 'git merge master' if ba-merge already had masterAmbala
You could leave it off. The only reason it would be useful is if new stuff landing in master while you were working on reviewing the code and fixing conflicts.Gristede
@EricAnderson why would you need a throw away branch if something failed during merge? Isn't just cancelling the merge changes be enough? Something like, git reset --hard; git clean -fd ?Behah
Yea, you don't need to delete it. I posted this many years ago when I understood less about git. Canceling or doing a reset is probably what you want.Gristede
I have always used 'git merge foo --no-commit --no-ff' and then git merge --abort; git add .; git stash; git drop; :)Balkh
C
61

If anyone is trying to generate a diff file from two branches :

git diff master..otherbranch > myDiffFile.diff
Crevasse answered 3/4, 2013 at 14:1 Comment(2)
This has come in handy especially with large branches containing a lot of differences.Peeler
This is useful when the difference is really large. By default it would not show all diff in the console (I was wondering why), passing the diff to a file is the way to go in such case.Gaskin
L
46

There is also a GUI based method.

You can use gitk.

  1. Run:

    $ gitk --all
    
  2. Right click on a commit of a branch and select Mark this commit in the pop-up menu.

  3. Right click on a commit of another branch and select Diff this -> marked commit or Diff marked commit -> this.

Then there will be a changed files list in the right bottom panel and diff details in the left bottom panel.

Lainelainey answered 14/6, 2013 at 6:1 Comment(3)
@Orwellophile I upload a video to show how to do it. I hope it will help to you.Lainelainey
Wow, just for me, I feel special. I've bookmarked it in delicious.com for future reference and extra google-foo.Upholstery
Severely underrated answer. Thanks!Augment
M
40

One more option, using meld in this case:

git difftool -d master otherbranch

This allows not only to see the differences between files, but also provides a easy way to point and click into a specific file.

Meaningful answered 24/4, 2014 at 13:23 Comment(5)
May want to set meld as default difftool: git config --global diff.tool meldGunn
This is my favorite because it will use whatever difftool you configure.Kiangsu
Not supported on OSX. :-(Kuykendall
@MikeS. please checkout this answer https://mcmap.net/q/41033/-view-differences-of-branches-with-meld it contains instructions for OSX. It works for me at least, hope it helps.Meaningful
Thank you! Been searching around and this command makes it so easy to see differences between 2 branches.Hollar
A
29

Note that git makes it easy to just try out the merge and back away from any problems if you don't like the result. It might be easier than looking for potential problems in advance.

Anlage answered 5/5, 2009 at 0:59 Comment(1)
David, that's a good point, although it'd be nice to just know what's going on before hand...Tetrapterous
B
21

And if you are looking for changes only among certain file(s), then:

git diff branch1 branch2 -- myfile1.js myfile2.js

branch1 is optional and your current branch (the branch you are on) will be considered by default if branch1 is not provided. e.g:

git diff master -- controller/index.js
Blissful answered 16/5, 2016 at 13:13 Comment(0)
U
15

When working collaboratively, or on multiple features at once, it's common that the upstream or even your master contains work that is not included in your branch, and will incorrectly appear in basic diffs.

If your Upstream may have moved, you should do this:

git fetch
git diff origin/master...

Just using git diff master can include, or fail to include, relevant changes.

Undoing answered 24/3, 2015 at 3:21 Comment(0)
S
11

If you are using IntelliJ IDEA, you can also compare any branch with your current working branch. See http://www.jetbrains.com/idea/webhelp/merging-deleting-and-comparing-branches.html#d288093e3827 for more info. This is available in the free edition as well.

Sholem answered 6/6, 2013 at 7:17 Comment(0)
P
9

There are plenty of answers here, but I wanted to add something that I commonly use. IF you are in one of the branches that you would like to compare I typically do one of the following. For the sake of this answer we will say that we are in our secondary branch. Depending on what view you need at the time will depend on which you choose, but most of the time I'm using the second option of the two. The first option may be handy if you are trying to revert back to an original copy -- either way, both get the job done!

This will compare master to the branch that we are in (which is secondary) and the original code will be the added lines and the new code will be considered the removed lines

git diff ..master

OR

This will also compare master to the branch that we are in (which is secondary) and the original code will be the old lines and the new code will be the new lines

git diff master..
Pumpkinseed answered 31/5, 2017 at 22:0 Comment(0)
P
8

There are two branches lets say

  • A (Branch on which you are working)
  • B (Another branch with which you want to compare)

Being in branch A you can type

git diff --color B

then this will give you a output of

enter image description here

The important point about this is

  1. Text in green is inside present in Branch A

  2. Text in red is present in Branch B

Piston answered 4/10, 2016 at 11:56 Comment(0)
C
2

If you are using Github / Github Enterprise, you can use the Web UI by hitting the url /compare of your repository path, for instance, https://github.com/http4s/http4s/compare. You can select the branch / commit / tag that you want to compare: Github Compare Screenshot

And the diff will be presented in the github interface at the url /compare/{x1}...{x2} where are x2 and x1 are the branch / commit / tag you want to compare, for instance: https://github.com/http4s/http4s/compare/main...dotty

You can see more in the Github Doc.

Cockeyed answered 3/12, 2019 at 9:37 Comment(1)
Thanks a lot. Have been struggling to find this.Appointee
U
1

OP wanted some other option, but probably it can be helpful to somebody: it is possible to see modified file list linked to commits

git log --name-status other-branch..

It is also works with commits

git log --name-status commit1..commit2
Unfinished answered 19/4, 2023 at 17:46 Comment(0)
C
0
git diff revision_n revision_m

if revision_n and revision_m are successive commits then it outputs same as git show revision_m

Crosscheck answered 1/3, 2019 at 9:49 Comment(1)
Perfect for my use case. I needed only the file names, so I used --name-only to get a list of changed files. git diff --name-only rev_old rev_newTickler
G
0

For people who are looking for a GUI solution, Git Cola has a very nice "Branch Diff Viewer (Diff -> Branches..).

Galven answered 17/4, 2019 at 4:55 Comment(1)
Question is asking for a command line solution, not a GUI.Bamby
Q
0

I made a pipeline that outputs a list of all filenames that have been modified between 2 branches. This is useful for piping to another program, not for viewing the diffs directly as other responses.

yes n | git difftool main..develop | grep V |sed "s#Viewing ([0-9]*/[0-9]*): ##g"

Or, if you simply want the difference between the current branch and another one:

yes n | git difftool develop | grep V |sed "s#Viewing ([0-9]*/[0-9]*): ##g"

git difftool develop will prompt you for opening files in your difftool. I use yes n to refuse everything and then simply format the text with grep and sed.

Quadri answered 16/1, 2023 at 17:3 Comment(3)
Probably it's better to remove quotes in outputUnfinished
@Unfinished may I ask why? I prefer leaving the quotes just in case there is some badly named file with spaces or other weird characters. If you want to remove them, here's the pipeline: yes n | git difftool develop | grep V |sed "s#Viewing ([0-9]*/[0-9]*): ##g" | sed "s/'//g" Quadri
It's easy to copy-paste file names without themUnfinished
M
0

Only file paths without commit msg for parsing

All the other answers were giving me list of paths to files but also commit messages between file paths. Below are solutions that produce file paths but without commit msg. They are handy if you want to parse file paths later and don't care about the commit msg.

file paths prefixed with modification status

git log --name-status --pretty='' commit1..commit2

only file paths

git log --name-only --pretty='' commit1..commit2

only unique file paths

git log --name-only --pretty='' commit1..commit2 | sort -u
Mezzorelievo answered 31/8, 2023 at 15:40 Comment(0)
K
-1

You can also use a visual diff.

For example, if you are using Sourcetree, you can simply select any two commits in log view.

(I personally prefer using a GUI in most cases for this, and I'm posting this for those who may not be familiar with GUI options.)

Karlkarla answered 27/6, 2019 at 16:9 Comment(1)
Question is asking for a command line solution, not a GUI.Bamby
B
-2

If you like GUI and are using Windows, here is an easy way.

  1. Download WinMerge
  2. Check out the two branches into different folders
  3. Do a folder by folder compare using WinMerge. You can also easily make modifications if one of the branches is the one you are working on.
Barghest answered 19/6, 2018 at 23:21 Comment(2)
It is not the simplest way, there actually is no need to download repos to diff between branches.Indignation
It is indeed not the simplest way, but it is the GUI way, which often is a lot easier especially for seeing the diffs in all the filesBarghest
A
-3

You can also easily compare branches for changed files using for example TortoiseGit. Just click on Browse References and pick the branches you want to compare.

For example if you compare your branch with master you will get as a result list of files that will be changed in master if you decide to merge your-branch into master.

Remmber that you will have different result if you compare master with your-branch and your-branch with master.

Arteritis answered 18/10, 2017 at 9:53 Comment(1)
the question seems to be about native git utilityWrennie

© 2022 - 2024 — McMap. All rights reserved.