Почему 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
Что заставляет хэш меняться? Это связано с меткой времени фиксации?
Ответы
Ответ 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.