Diffing between two entire directories/projects in hg or git?
Solution 1
git diff
does exactly that. but it only works for git projects.
hg diff
, svn diff
pretty every version control system can diff directory trees
Solution 2
To simply create a diff patch in git's diff format from two arbitrary files or directories, without any fancy repository stuff or version control:
git diff --no-index some/path other/path > some_filename
Jakub Narębski's comment on knittl's answer hinted at the answer... For simplicity's sake, that's the full command.
The >
part creates a file and redirects the output to it. If you don't want a file and just want the output printed in your console so you can copy it, just remove the > some_filename
part.
For convenient copying and pasting, if you've already cd
ed to a directory containing the original directory/file named a
and the modified directory b
, it'll be:
git diff --no-index a b > patch
Solution 3
From git diff
manpage:
git diff [--options] [--] [<path>...]
[...]
If exactly two paths are given, and at least one is untracked, compare the two files / directories. This behavior can be forced by--no-index
.
If you want to compare two versions (e.g. two tagged releases, or two branches) in two different repositories, you can use trick described in GitTips page on Git Wiki, under "How to compare two local repositories".
Assuming that you are inside one repository, and second repository is in /path/to/repo
, so its GIT_DIR is /path/to/repo/.git
if it is non-bare repository, you can something like the following:
$ GIT_ALTERNATE_OBJECT_DIRECTORIES=/path/to/repo/.git/objects \
git diff $(git --git-dir=/path/to/repo/.git rev-parse --verify A) B
where A and B are revisions you want to compare. Of course you can also specify path limiter in above expression.
Explanation: GIT_ALTERNATE_OBJECT_REPOSITORIES
variable can be used to make git commands concatenate object database of the two repositories. git --git-dir=... rev-parse ...
is used to turn name (extended SHA-1 expression) in repository given as parameter to git-dir
option into unique SHA-1 identifier. The $( ... )
construct puts result of calling given command in command line. git diff
is used to compare two revisions (where one is from alternate object repository).
Alternate solution would be to simply import other repository into given repository, using git remote add
(and git fetch
). Then you would have everything locally, and would be able to do comparision inside single repository.
Solution 4
Is there some sort of utility for hg/git where I can do a tree diff... [s]o that say, there's a mark between newly added files, deleted files... [emphasis added]
Yes. We can git diff
the current directory against another directory and...
...mark the added, deleted, and modified files:
git diff --name-status --no-index ./ path/to/other/dir
...show only added files:
git diff --diff-filter=A --name-status --no-index ./ path/to/other/dir
... show only deleted files:
git diff --diff-filter=D --name-status --no-index ./ path/to/other/dir
...show only modified files:
git diff --diff-filter=M --name-status --no-index ./ path/to/other/dir
See also: https://git-scm.com/docs/git-diff
Solution 5
It's not git-specific, but as a general diff utility for Windows, I really like WinMerge.
meder omuraliev
I began learning front end web development around 04-05, started my first program around 06 with PHP. Currently, I am a Web technologist specializing in full stack development and linux administration specializing with the LAMP stack ( HTML5, CSS3, PHP, Apache, MySQL). I also like to dabble in node.js, meteorjs, Python, django and in general like to mess with new technology/stacks. LinkedIn | [email protected]
Updated on July 05, 2022Comments
-
meder omuraliev almost 2 years
I inherited a project originally stored in CVS with all the revisions. I made quite a few edits, and I'm trying to compare all the changes I made in the original directory, in regards to new files added versus the old ones.
Is there some sort of utility for hg/git where I can do a tree diff, or something of that nature? So that say, there's a mark between newly added files, deleted files, am I asking for too much?
-
meder omuraliev over 14 yearsCan you expand on how I can use
git diff
? I created two separate git projects, how can I compare them now? I'm still relatively new to VCSing. -
knittl over 14 yearsyou only need one project. commit all your files, make your changes, commit again. you can then do
git diff HEAD^..HEAD
, which diffs your latest version against the one before it -
meder omuraliev over 14 yearsOk - I guess I got what I wanted because I'm seeing a ton of results, can you recommend a nice GUI?
-
knittl over 14 yearstry
gitk
andgit gui
, gitk visualizes project history, git gui allows you to prepare commits and such -
Anonigan over 14 yearsActually
git diff
can compare arbitrary files/directories; you might need to use its--no-index
option -
Shaun Luttin over 7 yearsTo use
git diff
options, add the options before the paths. E.g.git diff --name-status --no-index some/path other/path
works with the--name-status
option. -
qwr almost 4 yearsuse
--binary
for binary files, otherwise the patch will just say "Binary files differ" -
qwr almost 4 yearsFrom git-diff manpage: "You can omit the
--no-index
option when running the command in a working tree controlled by Git and at least one of the paths points outside the working tree, or when running the command outside a working tree controlled by Git."