了解两个存储库之间的区别


Answers:


249

在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

我必须根据其他答案指定remotes / b / master:stackoverflow.com/a/4710379/284051
Doug Moscrop 2012年

3
如果需要将repo_a / master与特定的repo_b标签进行比较怎么办?
大卫·托雷斯

2
对我不起作用,它抛出:致命:模棱两可的参数“ remotes / b / master”:未知的修订或路径不在工作树中。使用“-”将路径与修订分开,例如:'git <命令> [<修订> ...]-[<文件> ...]'这里有什么想法吗?
Andrew Heekin 2015年

2
我和@AndrewHeekin一样。有没有人有办法解决吗?
议会

4
我似乎需要指定origin/master而不是裸露master。此外,这会发现主分支之间的差异,那么如果要查找所有不同的分支怎么办?例如,检查存储库备份的状态?
davidA

33

MELD可以比较目录:

meld directory1 directory2

只需使用两个git repos的目录,您将得到一个很好的图形比较:

在此处输入图片说明

单击蓝色项目之一时,可以看到更改了。


1
在我的VS解决方案中比较项目时,Meld冻结了,但BeyondCompare却没有。
萨沙邦德

3
在OSX中:diff -rq folder1 folder2
标记

1
精彩的链接!非常简单的程序,我现在将其用作OSX的差异程序。
dmanexe

1
这绝对是可爱的!感谢分享。
Shihab Khan

我不确定meld是否能够处理git忽略的文件-使用时应考虑这一点
noamgot

11

您可以先将其他存储库添加为当前存储库的远程目录:

git remote add other_name PATH_TO_OTHER_REPO

然后从该远程获取分支:

git fetch other_name branch_name:branch_name

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

git diff branch_name

7

将两个分支都放在一个存储库中后,即可进行操作git diff。将它们存储在一个存储库中就像

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

有什么办法可以做些小的改动来选择历史记录:例如,在远程回购文件中,将文件放置在一个目录中,但是我想将更改应用于同一文件,但将其放置在本地回购中的不同目录中?
Eugen Konkov '17

如果您谈论的是一个小的更改,我认为最简单的方法就是进行比较,然后使用补丁将其重新应用于其他文件。
Michael Krelin-黑客

尽管文件名不同,但由于文件名不同而未应用补丁
Eugen Konkov

哦,我只考虑不同的目录,而不考虑文件名(可通过补丁选项轻松处理目录)。好吧,对于文件名,我只是手动或通过脚本进行更改。就是说,我并不是说没有更好的解决方案,这就是我能在不深入研究的情况下提出的解决方案。
Michael Krelin-黑客

7
git diff master remotes/b

那是不对的。remotes/b是远程的,但不是分支。

为了使其正常工作,我必须这样做:

git diff master remotes/b/master

这实际上应该是对相关答案的评论。
EntangledLoops

6

请参见http://git.or.cz/gitwiki/GitTips,“常规”中的“如何比较两个本地存储库”部分。

简而言之,您正在使用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)头

在哪里../repo_b/.git是repo_b中对象数据库的路径(如果它是裸存储库,则为repo_b.git)。当然,您可以比较任意版本,而不仅仅是HEAD。


请注意,如果repo_a和repo_b是相同的存储库,则将它们都放置在同一存储库中可能更有意义,可以使用“ git remote add -f ...”为存储库创建昵称以进行重复更新,也可以不使用git fetch ...;如其他回应中所述。


5

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

只需打开两个仓库的父文件夹,然后等待它建立索引即可。然后,您可以右键单击文件夹或文件,Compare to...然后在另一侧选择相应的文件夹/文件。

它不仅显示哪些文件不同,还显示其内容。比命令行容易得多。


2

最好的选择是将两个存储库都放在本地计算机上,并使用带有两个目录作为参数的linux diff命令:

diff -r repo-A repo-B


1
使其可用的唯一方法是重命名.git目录之一。这就减少了两行无关紧要的页面。到那里去了,做了那件事,来到这里寻找更好的答案。
hildred '16

2

一种简单的方法,无需触摸您的遥控器配置。在主仓库中的仓库A中(假设您要比较主分支):

git fetch path/to/repo_b.git master
git diff FETCH_HEAD

0

您可以使用以下命令:

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

0

提醒自己...首先获取,否则存储库没有本地哈希(我想)。

步骤1.设定上游遥控器及以上^

区分单个文件遵循以下模式:

git diff localBranch uptreamBranch --spacepath / singlefile

git diff master upstream/nameofrepo -- src/index.js

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.