Почему git commit --amend изменяет хэш, даже если я не делаю никаких изменений?

почему хэш SHA-1 моей последней фиксации изменяется, даже если я не делаю никаких изменений в фиксации (сообщение, файлы) после запуска git commit --amend?

скажем, я запускаю следующее в командной строке.

cd ~/Desktop
mkdir test_amend
cd test_amend
git init
echo 'foo' > test.txt
git add test.txt
git commit -m 'initial commit'

затем, вызывая

git log --pretty=oneline --abbrev-commit

выводит следующее сообщение:

b96a901 initial commit

Я тогда вообще

git commit --amend

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

тогда я делаю

git log --pretty=oneline --abbrev-commit

еще раз, я вижу, что хэш фиксации изменился:

3ce92dc initial commit

что вызывает изменение хэша? Имеет ли это отношение к отметке времени фиксации?

3 ответов


Да, он фиксирует время. Проверка содержимого двух коммитов показывает:

$ git cat-file commit 82c7363bcfd727fe2d6b0a98412f71a10c8849c9
tree d87cbcba0e2ede0752bdafc5938da35546803ba5
author Thomas <xxx> 1400700200 +0200
committer Thomas <xxx> 1400700200 +0200

hello

$ git cat-file commit 7432fcf82b65d9d757efd73ef7d6bff4707f99bd
tree d87cbcba0e2ede0752bdafc5938da35546803ba5
author Thomas <xxx> 1400700200 +0200
committer Thomas <xxx> 1400700214 +0200

hello

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


следующие вещи идут в создании объекта commit sha

  1. ссылка на объект дерева
  2. ссылка на родительский объект
  3. имя автора
  4. автор совершает отметку времени с часовым поясом (e.g для меня ее +530) [может быть отличается от commiter, например, в случае cherry picking]
  5. имя коммиттер
  6. фиксация метки времени с часовым поясом (e.g для меня ее +530)
  7. фиксация

Я пытался выяснить, почему идентификаторы commit SHA отличаются после сброса и снова добавления того же файла с точно таким же сообщением о фиксации одним и тем же пользователем с той же родительской ссылкой и ссылкой на объект дерева .


изменение git commit изменяет дату фиксации (которая отличается от даты, которую вы изначально видите при запуске git log -- run git log --format=fuller чтобы увидеть дату фиксации). Дата фиксации учитывается при создании хэша фиксации.