【问题标题】:How to see the difference between two identical revisions?如何查看两个相同版本之间的差异?
【发布时间】:2018-01-10 10:49:34
【问题描述】:

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
|
.

【问题讨论】:

  • 您能否通过分支图向我们展示a1e45010 提交的位置,以及它们之间的关系(如果有的话)?
  • @TimBiegeleisen 公平点

标签: git version-control git-diff git-hash


【解决方案1】:

不是仅根据内容计算哈希吗?那为什么 diff 没有检测到任何东西呢?

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

【讨论】:

  • 这并没有说明由“看似”相同的代码生成的不同程序
  • 我不明白这个反对意见。您正在尝试解决相反的问题(不同的祖先,相同的程序)不是吗?显然,如果两棵树汇聚成包含相同的代码,那么就从它们的内容生成可执行文件而言,它们是相同的。
  • (病态的极端案例:构建遍历所有历史并为不同的祖先产生不同的结果。if "6d08e83" not in parent_commits: crash()
  • @tripleee 不,问题是:不同的祖先,空的差异,不同的程序。
  • 差异究竟是如何体现的?我会说程序 确实 以某种方式依赖于您的 Git 历史记录,或者您没有运行完全仅从您在版本控制中拥有的源构建的东西。
【解决方案2】:

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

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

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

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

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

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

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


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

 git show <SHA-1>

例如,下面是 git show 的样子:

【讨论】:

  • 我接受了这个答案,因为它有格式和图片
猜你喜欢
  • 2012-04-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多