如何查看两个相同修订版之间的区别?

How to see the difference between two identical revisions?

TL;DR

不同的血统,空差异,不同的程序。如何看出有什么不同?


这个问题的答案,我想,应该是:如果它们相同,那么没有区别。

我现在遇到的情况是,我有两个不同的修订版,似乎有一个空差异。

> git diff --quiet a1e4 5010; echo $?
> 0

它们有不同的提交散列,它们包含的程序行为不同,但 diff 是空的。这怎么可能?

有没有更强大的diff我不知道那会显示出更深层次的差异?

散列不是只根据内容计算的吗?那为什么 diff 没有检测到任何东西?

这是图表

*   551d4dc very merge
|\
| |
| *   a1e4b09 wow!
| |\
| | |
| | *   a337e3c so uninteresting
| | |\
| | | |
| * | | a9f878a many unimportant
| |/ /
| | |
| * | 6d08e83 such irrelevance
| | |
* | | 5010427 wow!
| |/
|/|
| |
* | 74ac627 many father
|/
|
* f0aa6af such grandpa
|
.

Isn't the hash computed on content alone? Then why is the diff not detecting anything?

的散列仅取决于其内容。 commit 包含对树的引用,还包含提交消息、日期、作者、对其父提交的引用等,其哈希是所有这些信息。两次提交可以反映相同的文件状态,并且它们之间没有差异,但具有不同的哈希值。事实上,他们必须这样做。

The answer to the question, I thought, should be: if they are identical, there are no differences.

2 次提交的内容相同,这意味着在幕后 git 将对树(指针)使用相同的 SHA-1,但正如 hobbs 上面解释的 commit SHA-1 是提交内容的校验和

提交包含 blob 树和更多信息。
提交对象本身只是元数据的校验和 (SHA-1),包括给定提交的树的树对象。

提交包含的信息比下图中包含的信息更多,例如时间戳等。

为了理解存储在提交中的内容,我们需要了解什么是提交。提交是附加到内容的元数据。

每次您将文件添加到 git 时,它们都会开始被内容的 SHA-1 跟踪和命名。当您提交更改时 git 创建一个 tree 对象,它指向在此修订中提交的文件的树。

如果没有进行任何更改,树将指向与上一次提交相同的树。如果有变化,就会有一棵新树。


如果您想查看提交的内容,请使用 git show

 git show <SHA-1>

例如这里是 git 显示的样子: