【问题标题】:Getting the difference between two repositories获取两个存储库之间的差异
【发布时间】:2010-12-30 10:10:19
【问题描述】:

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

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

【问题讨论】:

标签: git git-diff


【解决方案1】:

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

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

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

git diff localBranch uptreamBranch --spacepath/singlefile

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

【讨论】:

    【解决方案2】:

    请参阅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/.git 是 repo_b 中对象数据库的路径(如果它是裸存储库,它将是 repo_b.git)。当然,您可以比较任意版本,而不仅仅是 HEAD。


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

    【讨论】:

      【解决方案3】:

      您可以使用以下命令:

      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/"
      

      【讨论】:

      • 基于@andrew-heekin 解决方案
      【解决方案4】:

      无需触摸遥控器配置即可轻松完成此操作。 从 repo A,在 master 中(假设你想比较 master 分支):

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

      【讨论】:

        【解决方案5】:

        您可以先将其他 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
        

        【讨论】:

          【解决方案6】:

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

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

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

          【讨论】:

            【解决方案7】:

            Meld可以比较目录:

            meld directory1 directory2
            

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

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

            【讨论】:

            • 在我的 VS 解决方案中比较项目时,Meld 冻结,BeyondCompare 不是。
            • 在 OSX 中:diff -rq folder1 folder2
            • 精彩链接!非常简单的程序,我现在将其用作 OSX 的差异程序。
            • 这绝对是可爱的!感谢分享。
            • 这就是我的解决方案。非常简单的 git 存储库比较。
            【解决方案8】:

            在 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
            

            【讨论】:

            • 如果需要比较 repo_a/master 和 repo_b 的特定标签怎么办?
            • 对我不起作用,它正在抛出:致命:模糊参数'remotes/b/master':未知修订或路径不在工作树中。使用 '--' 将路径与修订分开,如下所示:'git [...] -- [...]' 有什么想法吗?
            • 我和@AndrewHeekin 一样。有人有解决办法吗?
            • 我似乎需要指定origin/master,而不是简单的master。另外,这找到了主分支之间的差异,那么如果你想找到所有不同的分支怎么办?例如。检查存储库备份的状态?
            • 你能解释一下每一行都在做什么吗?谢谢!
            【解决方案9】:

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

            diff -r repo-A repo-B

            【讨论】:

            • 使其可用的唯一方法是重命名 .git 目录之一。这减少了两行无关紧要的差异页面。去过那里,做过,来这里寻找更好的答案。
            【解决方案10】:
            git diff master remotes/b
            

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

            为了让它发挥作用,我必须这样做:

            git diff master remotes/b/master
            

            【讨论】:

            • 这确实应该是对相关答案的评论。
            【解决方案11】:

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

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

            【讨论】:

            • 有没有办法通过一点改变来挑选历史记录:例如,在远程 repo 文件被放置在一个目录中,但我想将更改应用到同一个文件,但它被放置在不同的目录中本地仓库?
            • 如果你说的是一个小的改变,我认为最简单的方法就是做一个差异,然后使用补丁将它重新应用到另一个文件。
            • 未应用补丁,因为文件名不同,尽管它们是相同的文件
            • 哦,我只想到不同的目录,而不是文件名(目录可以通过补丁选项轻松处理)。好吧,对于文件名,我只需手动或通过脚本更改它们。话虽如此,我并不是说没有更好的解决方案,我只是说我无需挖掘就可以想出什么。
            • 如果我想比较所有分支怎么办?
            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 2023-03-15
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2011-06-28
            • 2020-03-22
            相关资源
            最近更新 更多