有没有办法检查两个不同的git提交内容是否相同?

问题描述 投票:0回答:4

我知道 git 会跟踪内容并部分根据内容生成 sha。然而,sha 也是基于父提交的。 当我对分支进行变基时,因为我的提交现在有不同的祖先,所以我的所有提交都有不同的 shas。

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

我在想如果有某种方法可以在不合并祖先信息的情况下获取内容的sha,那可能会成功。

感谢您的所有帮助,

git
4个回答
17
投票

您需要 git log 的 --cherry-mark 选项,当补丁内容相同时用等号标记提交。

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

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


7
投票

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

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


[编辑]

git diff
也可用作终端差异查看器:

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

或者,如果您在不支持

<( ... )
替换的 shell 中运行:

git show 123456 > /tmp/patch1.txt
git show abcdef > /tmp/patch2.txt

# use any diff tool to compare the two files:
diff /tmp/patch1.txt /tmp/patch2.txt
git diff /tmp/patch1.txt /tmp/patch2.txt
kdiff2 /tmp/patch1.txt /tmp/patch2.txt
...

0
投票

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

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


0
投票

@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
命令,以封装提交范围内的所有更改。

© www.soinside.com 2019 - 2024. All rights reserved.