Как увидеть разницу между двумя одинаковыми ревизиями?

TL;DR

различное происхождение, пустой diff, другая программа. Как увидеть, в чем различия?


Я подумал, что ответ на вопрос должен быть таким: если они идентичны, различий нет.

Что сейчас происходит со мной, так это то, что у меня есть две разные ревизии, которые, кажется, имеют пустой дифференциал.

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

2 ответа

Решение

Я подумал, что ответ на вопрос должен быть таким: если они идентичны, различий нет.

Содержимое двух коммитов одинаково, что означает, что git будет использовать тот же SHA-1 для дерева (указатель), но, как пояснили выше hobbs, коммит SHA-1 является контрольной суммой содержимого коммита.

Фиксация содержит деревья BLOB-объектов и дополнительную информацию.
Сам объект фиксации представляет собой просто контрольную сумму (SHA-1) метаданных, включающую в себя объект дерева для дерева данного коммита.

Коммит содержит больше информации, чем та, которая содержится на изображении ниже, например, отметка времени и многое другое.

Чтобы понять, что хранится в коммите, нам нужно понять, что такое коммит. Коммит - это метаданные, прикрепленные к контенту.

Каждый раз, когда вы добавляете файлы в git, они начинают отслеживаться и именоваться SHA-1 содержимого. Когда вы фиксируете изменения, git создает объект дерева, который указывает на дерево файлов, фиксируемых в этой ревизии.

Если не было сделано никаких изменений, дерево будет указывать на то же дерево, что и предыдущий коммит. Если произошли изменения, появится новое дерево.


введите описание изображения здесь

Если вы хотите просмотреть содержимое коммита, используйте git show

 git show <SHA-1>

Например, вот как это будет выглядеть в git show:

введите описание изображения здесь

Разве хэш не вычисляется только для контента? Тогда почему diff ничего не обнаруживает?

Хеш дерева зависит только от его содержимого. Коммит содержит ссылку на дерево, а также сообщение о коммите, дату, автора, ссылку на его родительский коммит (ы) и т. Д., И его хэш является хешем всей этой информации. Два коммита могут отражать одно и то же состояние файлов и не иметь различий между ними, но иметь разные хэши. На самом деле, они должны.

Другие вопросы по тегам