在两个Git仓库中查找差异

22

我已经fork了一个在Github上的项目的git代码库,并对其进行了修改。 我想获取我的代码库和原始代码库之间的差异。有人可以告诉我用哪个git命令来获取这个diff吗?我需要提交这个diff供审核。

原始代码库:

git://github.com/apache/hive.git

我的代码仓库:

git@github.com:prafullat/hive.git

这是我.git/config的详细信息。

[remote "origin"]
    fetch = +refs/heads/*:refs/remotes/origin/*
    url = git@github.com:prafullat/hive.git
[remote "mirror"]
    fetch = +refs/heads/*:refs/remotes/origin/*
    url = git://github.com/apache/hive.git

我尝试查看其他关于同一主题的已发布问题,但无法使其工作。

非常感谢任何帮助。


可能是重复的问题:如何比较两个Git仓库? - Ciro Santilli OurBigBook.com
可能是获取两个存储库之间差异的方法的重复问题。 - Rumid
5个回答

15

您需要获取两个远程存储库的最新版本并将主分支彼此进行比较。 看起来主分支是'trunk'分支,因此您可以像这样查看哪些提交是唯一的,并且不在'mirror'项目的'trunk'分支中:

$ git log --oneline origin/trunk ^mirror/trunk
1c4fa82 1. Modified the flag name for gb_to_idx rewrite to    hive.ql.rewrite.gb_to_idx    So
638be54 Merge branch 'trunk' of git@github.com:prafullat/hive into trunk
72c8220 HIVE-1383. Allow HBase WAL to be disabled (John Sichi via Ning Zhang)
a372259 Checking in commented meta-data methods in GbToCompactSumIdxRewrite. It has to be unc
33c1fb1 Fixing some files due to wrong application of patch. Build now compiles !
5942728 Reverting files which were patched twice in last checkin.
5efda04 Adding inital rewrite changes. This patch adds basic query rewrite support to Hive. I
3fce190 Merge branch 'trunk' of git://github.com/apache/hive into trunk
b3f9ff2 Checking in commented meta-data methods in GbToCompactSumIdxRewrite. It has to be unc
d89deb9 Fixing some files due to wrong application of patch. Build now compiles !
11db7da Reverting files which were patched twice in last checkin.
88fee30 Adding inital rewrite changes.
ba7703f Some part of last check-in got missed.
2c5c5ae Checking initial changes for Hive indexing from He Yongqiang (Hive-417) Here is descr

或者您可以删除 --oneline 以查看完整的提交消息。它们似乎都属于您。如果您不想看到那些合并提交,还可以添加 --no-merges

接下来,您可以通过运行以下命令来获取实际差异:

$ git diff --stat mirror/trunk...origin/trunk
 README.txt                                         |    4 +-
 build.xml                                          |    1 +
 .../java/org/apache/hadoop/hive/conf/HiveConf.java |    1 +
 ivy/ivysettings.xml                                |    4 +-
 metastore/if/hive_metastore.thrift                 |   12 +-
 .../apache/hadoop/hive/metastore/api/Index.java    |   15 +-
 .../hive/metastore/api/ThriftHiveMetastore.java    |  671 +++++++++++++++++++-
 metastore/src/gen-php/hive_metastore_types.php     |   30 +-
 .../hadoop/hive/metastore/HiveMetaStore.java       |  155 ++++-
 .../hadoop/hive/metastore/HiveMetaStoreClient.java |    9 +-
 .../hadoop/hive/metastore/IMetaStoreClient.java    |   14 +
 .../hadoop/hive/metastore/MetaStoreUtils.java      |   31 +
(bunch more lines)
 ql/src/test/queries/clientpositive/index_compact.q |   13 +
 .../test/queries/clientpositive/index_projection.q |   13 +
 ql/src/test/queries/clientpositive/index_summary.q |   13 +
 .../queries/clientpositive/ql_rewrite_gbtoidx.q    |    9 +
 .../results/clientpositive/index_compact.q.out     |   70 ++
 .../clientpositive/ql_rewrite_gbtoidx.q.out        |  211 ++++++
 .../primitive/PrimitiveObjectInspectorUtils.java   |   29 +-
 57 files changed, 4000 insertions(+), 131 deletions(-)
如果您删除--stat,则会得到实际的差异。在mirror/trunkorigin/trunk之间的...是一种简写方式,表示您想要获取公共祖先之间的差异,因此它不会给您一个移除了您开始以来添加到原始项目的所有内容的差异,它只会给您展示您在分支上所做的更改。

很好的详细解释。+1。关于“...”语法,请参见https://dev59.com/cUzSa4cB1Zd3GeqPqN2K和https://dev59.com/lnVD5IYBdhLWcg3wNIvc#53573,以及非常完整的答案:https://dev59.com/0HRA5IYBdhLWcg3wuAYo。 - VonC
我一直收到以下错误信息。如何修复?[prafulla@prafulla-laptop hive] $git log --oneline origin/trunk ^mirror/trunk 警告:refname'origin/trunk'不明确。 警告:refname'mirror/trunk'不明确。 - Prafulla
看起来你可能意外地创建了一个名为'origin/trunk'的本地跟踪分支,这是常见的问题,很不幸git甚至让你这样做。你可以通过运行git log refs/remotes/origin/trunk ^mirror/trunk来修复它,这将使其不含歧义。我会建议你删除本地(refs/heads/origin/trunk)引用,但你可能已经在上面工作了,我需要查看你所有的引用。你可以运行git for-each-ref并将输出粘贴到这里,我可以告诉你是否可以安全地删除它。 - Scott Chacon
如果你在Git上做了很多工作,花点时间阅读一些类似于Pro Git(http://progit.org/book)的内容来更好地学习Git可能也是值得的。 - Scott Chacon

5

这里存在一个缺陷,以防有人再次遇到此问题。

[remote "origin"]
    fetch = +refs/heads/*:refs/remotes/origin/*
    url = git@github.com:prafullat/hive.git
[remote "mirror"]
    fetch = +refs/heads/*:refs/remotes/origin/*
    url = git://github.com/apache/hive.git

每当你在镜像上执行git fetch时,它就会覆盖.git/refs/remotes中的同一远程分支。你应该确保更改远程镜像的fetch以反映新名称。
[remote "origin"]
    fetch = +refs/heads/*:refs/remotes/origin/*
    url = giturl
[remote "mirror"]
    fetch = +refs/heads/*:refs/remotes/mirror/*
    url = giturl

然后是一个简单的:
git diff origin/master..mirror/master

3
手动获取提交 sha1 并在 diff 中使用解决了问题!
[prafulla@prafulla-laptop .git] $cd refs/remotes/
[prafulla@prafulla-laptop remotes] $cat origin/trunk
1c4fa827f4fad2aad67a4fa5b57d88afe51d1559
[prafulla@prafulla-laptop remotes] $cat mirror/trunk 
14f5fb7cba7bef466727a5b721c7c202e80e5dfd
[prafulla@prafulla-laptop remotes] $git diff 14f5fb7cba7bef466727a5b721c7c202e80e5dfd 1c4fa827f4fad2aad67a4fa5b57d88afe51d1559
.......
.... 差异如下!.......


2
git diff origin/master mirror/master

应该有类似的东西可以解决问题。


9
出现了错误。git diff remotes/origin remotes/mirror 致命错误:模糊的参数 'remotes/origin':未知的修订版本或不在工作树中的路径。 使用“--”来区分路径和修订版本。 - Prafulla

0
以上方法的一个缺点是它们只比较了特定的一对分支。如果你想找到所有提交记录,即使有些提交记录还没有合并回主分支,也要跨越你创建的所有分支,以查找本地仓库与远程仓库不同的地方,你可以执行以下操作:
git log --branches --not --remotes

这很有用。你如何反转它,以便显示所有与你的本地repo不同的远程未合并分支? - davidA

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