Как 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 ответ

Решение

(Отказ от ответственности: этот ответ основан на наблюдениях)

Он не отслеживает, какой коммит исправить, он ищет его, когда вы делаете ребаз, и использует сообщение коммита, чтобы найти правильное.

Я попробовал следующее:

  1. Создан новый репозиторий
  2. Сделано несколько коммитов
  3. Сделано 2 коммита, оба с сообщением "начальный"
  4. Затем я сделал фиксацию фикса, которая исправила последний из этих двух

    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, состоит в том, что это переживет ребаз, вишню и т. Д. Кроме того, это могло быть добавлено без реального способа записи этого шага в правильном виде. Кстати, потому что если бы он записал ша фиксации, которую исправил, эта запись либо предотвратила бы перебазирование, либо должна была бы быть также изменена.

Другие вопросы по тегам