Подтвердить что ты не робот

Почему 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

Что заставляет хэш меняться? Это связано с меткой времени фиксации?

4b9b3361

Ответ 1

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

$ 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

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

Ответ 2

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

  • ссылка на объект дерева
  • ссылка на родительский объект
  • имя автора
  • автор фиксирует метку времени с часовым поясом (например, для меня ее +530) [может быть отличается от коммитера, например, в случае сбора вишни]
  • имя коммиттера
  • фиксировать метку времени с часовым поясом (например, для меня его +530)
  • сообщение фиксации

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

Ответ 3

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