获取两个代码仓库之间的差异

300

如何获取两个git代码库之间的差异?

场景: 我们有repo_a和repo_b两个代码库。后者是以repo_a为基础创建的副本。此后,这两个代码库都进行了并行开发。有没有办法列出这两个代码库当前版本之间的区别呢?


3
可能是重复的问题:如何比较两个Git仓库? - Ciro Santilli OurBigBook.com
12个回答

348
在repo_a中:
git remote add -f b path/to/repo_b.git
git remote update
git diff master remotes/b/master
git remote rm b

6
如果你需要比较repo_a/master和repo_b的特定标签,该怎么办? - David Torres
5
对我来说不起作用,它抛出了一个错误:“fatal: ambiguous argument 'remotes/b/master': unknown revision or path not in the working tree.”。使用“--”来将路径与修订版本分开,就像这样:“git <command> [<revision>...] -- [<file>...]”。有什么想法吗? - Andrew Heekin
2
我得到了与@AndrewHeekin相同的结果。有人有解决方案吗? - parliament
4
似乎需要明确指定origin/master而不是单纯的master。此外,这会找到主分支之间的差异,那么如果您想找到所有不同的分支呢?例如,检查存储库备份的状态? - davidA
7
你能解释每一行在做什么吗?谢谢! - Enrique
显示剩余10条评论

73

Meld可以比较目录:

meld directory1 directory2

只需使用两个git仓库的目录,您就可以获得一个漂亮的图形化比较:

enter image description here

当您单击其中一个蓝色项目时,您可以查看更改内容。


3
Meld在比较我的VS解决方案中的项目时会冻结,而BeyondCompare则不会。 - Sasha Bond
7
在苹果电脑的操作系统中,使用命令 "diff -rq folder1 folder2" 可以比较文件夹 folder1 和 folder2 的不同之处。 - Mark
4
太好了!非常简单的程序,我现在正在将它用作我的OSX差异程序。 - dmanexe
3
这真是太棒了!谢谢分享。 - Shihab Khan
3
那对我来说是解决方案。非常容易的git仓库比较。 - Konstantinos Raptis
显示剩余4条评论

19

你可以将其他仓库作为远程仓库添加到你当前的仓库中:

git remote add other_name PATH_TO_OTHER_REPO

然后从远程获取分支:

git fetch other_name branch_name:branch_name

这将在您当前的仓库中创建一个新分支,然后您可以将该分支与任何分支进行差异比较,例如将当前分支与新分支(branch_name)进行比较:

git diff branch_name

1
分支名称:分支名称,其中other_name_branch:new_local_repo_branch_name表示其他名称的本地仓库分支名称。 - Dylan w

11

我使用 PyCharm,它具有比较文件和文件夹之间差异的强大功能。

只需打开两个存储库的父文件夹并等待索引完成即可。然后您可以使用右键单击文件夹或文件并选择“与...比较”选项,在另一侧选择相应的文件夹/文件。

它不仅显示文件的差异,还显示它们的内容。比使用命令行更容易。


10
不必更改远程配置即可轻松实现此操作。 从仓库A的主干(master)分支开始(假设您想比较主干(master)分支):
git fetch path/to/repo_b.git master
git diff FETCH_HEAD

9

一旦您将两个分支放在同一个存储库中,您可以执行 git diff命令。将它们放在同一个存储库中非常容易,只需执行以下操作:

git fetch /the/other/repo/.git refs/heads/*:refs/remotes/other/*

有没有一种方法可以挑选历史记录并进行一些更改:例如,在远程存储库中,文件放置在一个目录中,但我想将更改应用于本地存储库中放置在不同目录中的同一文件? - Eugen Konkov
如果你说的是一个小改动,我认为最简单的方法就是制作差异文件,然后使用补丁将其重新应用到另一个文件中。 - Michael Krelin - hacker
补丁未被应用,因为文件名不同,尽管它们是相同的文件。 - Eugen Konkov
哦,我只在考虑不同的目录,而非文件名(目录可以通过补丁选项轻松处理)。对于文件名,我只会手动或通过脚本更改它们。话虽如此,我并不是说没有更好的解决方案,只是我能够自己想出来的而已,没有深入挖掘到别的方法。 - Michael Krelin - hacker
如果我想要比较所有的分支,该怎么办呢? - endolith

9
git diff master remotes/b

那是不正确的。remotes/b 是一个远程仓库,但不是一个分支。

为了让它工作,我必须执行以下操作:

git diff master remotes/b/master

11
这应该是对相关答案的评论。 - EntangledLoops

8
请见http://git.or.cz/gitwiki/GitTips,在“General”中查看“How to compare two local repositories”一节。简而言之,您可以使用GIT_ALTERNATE_OBJECT_DIRECTORIES环境变量来访问另一个存储库的对象数据库,并使用git rev-parse--git-dir / GIT_DIR将其他存储库中的符号名称转换为SHA-1标识符。现代版本应如下所示(假定您在'repo_a'中):
GIT_ALTERNATE_OBJECT_DIRECTORIES=../repo_b/.git/objects \
   git diff $(git --git-dir=../repo_b/.git rev-parse --verify HEAD) HEAD
其中../repo_b/.git是repo_b中对象数据库的路径(如果它是裸版本库,则为repo_b.git)。当然,您不仅可以比较HEADs,还可以比较任意版本。 请注意,如果repo_a和repo_b是相同的存储库,则将它们都放入同一个存储库可能更有意义,可以使用“git remote add -f ...”为存储库创建昵称以进行重复更新,或使用“git fetch ...”,如其他响应中所述。

3
你可以使用以下命令:
diff -x .git -r repo-A repo-B

或者你可以使用并排的方式:

diff -x .git -W200 -y -r repo-A repo-B

如果需要对所有差异文件进行着色,您可以使用以下命令:

diff -x .git -W200 -y -r repo-A repo-B | sed -e "s/\(^diff .*\)/\x1b[31m\1\x1b[0m/"

基于@andrew-heekin的解决方案 - Gerard

2

在追随@iamamac的答案之后,为了让内容更简洁明了,我们可以添加一个漂亮的摘要

git remote add -f b path/to/repo_b.git
git remote update

我会使用 diff-tree

git diff-tree master remotes/b/master --compact-summary

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接