240

我们如何获得两个 git 存储库之间的区别?

场景:我们有一个 repo_a 和 repo_b。后者是作为 repo_a 的副本创建的。之后两个存储库都有并行开发。有没有办法列出这两个存储库当前版本的差异?

4

12 回答 12

301

在 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
于 2009-12-28T08:25:39.090 回答
54

Meld可以比较目录:

meld directory1 directory2

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

在此处输入图像描述

当您单击其中一个蓝色项目时,您可以看到发生了什么变化。

于 2016-05-30T14:00:15.130 回答
15

您可以先将其他 repo 作为远程添加到当前 repo:

git remote add other_name PATH_TO_OTHER_REPO

然后从该远程获取分支:

git fetch other_name branch_name:branch_name

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

git diff branch_name
于 2016-11-13T06:55:32.537 回答
9

在一个存储库中拥有两个分支后,您可以执行git diff. 将它们放在一个存储库中就像

git fetch /the/other/repo/.git refs/heads/*:refs/remotes/other/*
于 2009-12-28T08:21:26.587 回答
9
git diff master remotes/b

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

为了让它工作,我必须这样做:

git diff master remotes/b/master
于 2011-01-17T05:55:11.790 回答
7

请参阅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) HEAD

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


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

于 2009-12-28T12:59:27.990 回答
7

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

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

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

于 2016-10-20T23:00:08.867 回答
4

一种简单的方法来做到这一点,而无需触摸您的遥控器配置。从 repo A,在 master 中(假设你想比较 master 分支):

git fetch path/to/repo_b.git master
git diff FETCH_HEAD
于 2019-04-30T11:52:46.253 回答
2

您可以使用以下命令:

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

或并排您可以使用:

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

如果对每个 diff 文件进行着色,您可以使用:

diff -x .git -W200 -y -r repo-A repo-B | sed -e "s/\(^diff .*\)/\x1b[31m\1\x1b[0m/"
于 2019-10-31T07:35:02.427 回答
1

最好的办法是在本地机器上拥有两个 repos,并使用 linux diff 命令将两个目录作为参数:

diff -r repo-A repo-B

于 2015-11-10T18:46:40.450 回答
0

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

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

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

git diff localBranch uptreamBranch --spacepath/singlefile

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

于 2020-03-30T21:44:23.840 回答
0

在此之后跟进@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
于 2022-02-07T12:10:55.583 回答