Как git отслеживает хэш коммита, помеченный флагом fixup/squash?
Я знаю это git commit --fixup <commit A's hash>
может сделать коммит B, который будет объединен с коммитом A при выполнении git rebase -i --autosquash
,
И когда я бегу git log
мой журнал коммитов выглядит примерно так
commit <commit B's hash>
Author: xxx
Date: xxx
fixup! commit A's comment
commit <commit A's hash>
Author: xxx
Date: xxx
commit A's comment
Для меня фиксация исправления выглядит ничем не иначе, чем обычная фиксация, за исключением того, что комментарию предшествует "исправление!".
Интересно, как и где Git отслеживает тот факт, что commit B
это фиксация фиксации, помеченная<commit A's hash>
если это вообще происходит; и если это так, есть ли git log
эквивалент, который позволяет мне получить доступ <commit A's hash>
вместе с commit B
?
Спасибо!
1 ответ
(Отказ от ответственности: этот ответ основан на наблюдениях)
Он не отслеживает, какой коммит исправить, он ищет его, когда вы делаете ребаз, и использует сообщение коммита, чтобы найти правильное.
Я попробовал следующее:
- Создан новый репозиторий
- Сделано несколько коммитов
- Сделано 2 коммита, оба с сообщением "начальный"
Затем я сделал фиксацию фикса, которая исправила последний из этих двух
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, состоит в том, что это переживет ребаз, вишню и т. Д. Кроме того, это могло быть добавлено без реального способа записи этого шага в правильном виде. Кстати, потому что если бы он записал ша фиксации, которую исправил, эта запись либо предотвратила бы перебазирование, либо должна была бы быть также изменена.