(Отказ от ответственности: этот ответ основан на наблюдениях)
Он не отслеживает, какой коммит исправляется, он ищет его, когда вы делаете перебаз, и использует сообщение фиксации, чтобы найти правильный.
Я попробовал следующее:
- Создан новый репозиторий
- Сделал несколько коммитов
- Сделано 2 коммита, оба с сообщением «initial»
Затем я сделал фикч фикса, который исправил последний из этих двух
git commit --fixup bb4adbd
Теперь журнал выглядит так:
λ git lg
* 21e0572: (5 minutes ago) fixup! initial (HEAD -> master)
| Lasse Vågsæther Karlsen <lasse@vkarlsen.no> (Wed, 16 Jan 2019 17:32:51 +0100)
|
* bb4adbd: (5 minutes ago) initial
| Lasse Vågsæther Karlsen <lasse@vkarlsen.no> (Wed, 16 Jan 2019 17:32:38 +0100)
|
* e6549e4: (9 minutes ago) initial
| Lasse Vågsæther Karlsen <lasse@vkarlsen.no> (Wed, 16 Jan 2019 17:28:59 +0100)
|
* a311a82: (9 minutes ago) second
| Lasse Vågsæther Karlsen <lasse@vkarlsen.no> (Wed, 16 Jan 2019 17:28:12 +0100)
|
* 2a5ca27: (10 minutes ago) initial
Lasse Vågsæther Karlsen <lasse@vkarlsen.no> (Wed, 16 Jan 2019 17:27:12 +0100)
Если я сделаю это:
git rebase -i HEAD~3
Тогда Git предлагает это:
pick e6549e4 initial
fixup 21e0572 fixup! initial
pick bb4adbd initial
Здесь git пытается исправить мою первую «первоначальную» фиксацию, а не ту, о которой я говорил, чтобы исправить ранее.
Однако, если я просто сделаю HEAD~2
, это говорит о следующем:
pick bb4adbd initial
fixup 21e0572 fixup! initial
Это означает, что git не отслеживает, о каком коммите идет речь, он просто записывает fixup! <commit message>
в конце сообщения коммита фиксации фиксации.
Предположение относительно того, почему он делает это, вместо записи SHA, состоит в том, что это переживет ребаз, вишню и т. Д. Кроме того, это могло быть добавлено без реального способа записи этого ша. надлежащим образом, поскольку, если бы он действительно записал ша фиксации, которую исправил, эта запись либо предотвратила бы перебазирование, либо должна была бы быть также изменена.