11

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

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

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

感谢您的任何帮助,

4

4 回答 4

14

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

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

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

于 2012-07-12T20:41:43.770 回答
5

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

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

于 2019-08-29T21:12:14.517 回答
0

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

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

于 2012-07-12T19:20:02.647 回答
0

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

解决方案

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\|@@\).*$/) 的特定字符开头的行来减少输出中的混乱。这里的一些条件可以删除以获得更好的特异性,但由于 rebase 差异的性质,通常无关紧要。

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

于 2022-01-26T17:24:20.320 回答