【问题标题】:Is there a way to check if two different git commits are equal in content?有没有办法检查两个不同的 git 提交的内容是否相等?
【发布时间】:2012-07-12 19:17:38
【问题描述】:

我知道 git 会跟踪内容并部分基于内容生成 sha。但是,sha 也基于父提交。 当我重新设置分支时,因为我的提交现在有不同的祖先,所以我所有的提交都有不同的 shas。

但我想知道的是,有没有办法比较两个提交(或提交范围)以查看内容是否相同? 这也应该能够判断二进制更改是否相同。

我正在考虑是否有某种方法可以在不包含祖先信息的情况下获取内容的 sha,这可能会做到。

感谢大家的帮助,

【问题讨论】:

标签: git


【解决方案1】:

您希望 git log 的 --cherry-mark 选项在补丁内容相同时用等号标记提交。

git log --decorate --graph --oneline --cherry-mark --boundary A...B

是比较重新定位的分支 B 和原始分支 A 的好方法。我用它来检查我使用 git-tfs 所做的提交在 TFS 处理后是否仍然正常。

【讨论】:

  • 嗯...这似乎是最有前途的,除了一些我无法弄清楚的事情。第一个是,你如何拥有一个重新定位的分支 B 和一个原始的分支 A?你是创建一个备份分支还是产生一个新分支?在我的场景中,我只是在 master 上重新构建现有分支。第二个是在我的二进制文件中,即使它们的校验和完全相同,它也会将提交标记为不等价。有没有我遗漏的部分?
  • 你使用哪个版本的 git 和 --cherry-mark?我没有在我安装的东西上找到它。
  • 这个选项是在 2011 年 3 月 9 日提交 adbbb31 中添加到 revision.c 的,并且存在于 git 1.7.5 及更高版本中。 (我使用 git gui blame 和 git describe 来找出答案)。
  • 这太棒了
【解决方案2】:

https://stackoverflow.com/a/23527631/2630028

diff <(git show 123456) <(git show abcdef)

【讨论】:

    【解决方案3】:

    提交标头包含树对象的 sha,即文件系统内容(内容 + 结构)。编写一个脚本来比较它们不会太难。

    Blob 也有 ID,因此如果您只查看一两个文件,则可以比较它们。

    【讨论】:

    • 不幸的是,我不确定这是否完全正确(至少关于树)。基本上,当我查看提交的树 sha 时,它发生了变化,即使分支只是重新设置了基础(文件没有任何变化)。
    • 树 id 可能会因目录中的某些其他 blob 以某种方式发生更改而更改。如果您只想比较两个 blob 之间的差异,那么您必须编写某种代码来解压缩 blob,剥离标头,然后对剩下的内容进行哈希处理,以便进行您想要的比较。当然,您可以直接使用git log A..B -- path 并省去麻烦。
    【解决方案4】:

    @solstice333 的回答解决了问题背后的问题,但输出仍然需要大量解析。如果您想在变基后快速确认相似性,那么扩展该解决方案应该有助于减少大部分的混乱。

    解决方案

    hash1=123456 \
    hash2=098765 \
    sed_command='/^\(diff\|index\|@@\).*$/ d' \
    diff <(git show --oneline -U0 $hash1 | sed "$sed_command") <(git show --oneline -U0 $hash2 | sed "$sed_command")
    

    (如果你不使用bash,你可以只使用底线并替换变量)

    打破它

    此命令查找每次提交的更改,清理输出,并查找输出中的差异。输出通过以下方式修剪:

    • --one-line - 简化提交消息输出
    • -U0 - 仅显示更改的行/删除所有周围的行; --unified=0 的简写;
    • sed - 使用此命令,我们通过删除任何以基于正则表达式 (/^\(diff\|index\|@@\).*$/) 的某些字符开头的行来减少输出中的混乱。这里的一些条件可以删除以获得更好的特异性,但由于变基差异的性质,通常并不重要。

    我想你也可以扩展它以使用git diff 代替内部的git show 命令,以封装提交范围内的所有更改。

    【讨论】:

      猜你喜欢
      • 2011-04-08
      • 1970-01-01
      • 1970-01-01
      • 2020-08-04
      • 2021-01-12
      • 2015-06-02
      • 2012-03-29
      • 2014-11-05
      • 1970-01-01
      相关资源
      最近更新 更多