git: Разница между двумя очень похожими коммитами? - PullRequest
4 голосов
/ 29 ноября 2011

Мне нужно знать, почему два коммита разные. У меня есть два коммита, e2383d и 2c44ab, которые, по-видимому, так как они имеют разные хэши, разные.

Сначала я знаю о git diff, а сейчас пытаюсь git diff e2383d 2c44ab. Возвращается успешно, без вывода. Два коммита имеют:

  • То же сообщение о фиксации
  • Тот же автор
  • Тот же коммит дата ( отредактировано: извините, просто дата, смотрите мой ответ ниже)
  • Тот же родитель
  • То же содержание, , насколько я могу судить.

По сути, мое дерево выглядит так:

* ← stuff based on that commit
| * ← e2383d
* | ← 2c44ab
|/
* ← the common parent

Я собираюсь устранить e2383d, но прежде чем я сделаю это, я хотел бы убедиться, что там нет чего-то важного. Однако мое понимание git заключалось в том, что если бы два «коммита» были одинаковыми, они имели бы одинаковый хэш, и, следовательно, моя ситуация не существовала бы, если бы между ними не было разницы.

Еще одна вещь, которую я пробовал:

% diff <(git show 2c44ab) <(git show e2383d)  
1c1
< commit 2c44ab...
---
> commit e2383d...

Забыл, что коммиты имеют> 1 дату на них. Следующая команда показала (для меня) разницу между двумя моими коммитами:

% diff <(git show --pretty=fuller 2c44ab) <(git show --pretty=fuller e2383d)
1c1
< commit 2c44ab96bde429c9f345d8a12dfcf2278faa9333
---
> commit e2383d3164589bb3a8a679c9cb6bbe93ea41e2ee
5c5
< CommitDate: Wed Nov 23 17:06:40 2011 -0800
---
> CommitDate: Mon Nov 28 11:41:26 2011 -0800

Дата принятия в понедельник была временем, когда я делал ребазинг. Теперь, почему git хранит это - кажется, это побеждает ожидаемое мной поведение "Это тот же коммит, я его сложу".

1 Ответ

2 голосов
/ 29 ноября 2011

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

Если git говорит, что разница между коммитами A и B пуста, но вы все еще не уверены, вы можете убедиться, что они указывают на одно и то же дерево с помощью

git rev-parse A^{tree} B^{tree}

, в котором будут перечислены имена их древовидных объектов, или

git cat-file -p A
git cat-file -p B

, который покажет вам необработанные объекты коммита.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...