Как git отслеживает хэш коммита, помеченный флагом fixup / squash? - PullRequest
0 голосов
/ 16 января 2019

Я знаю, что 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

Мне кажется, что фиксация в fixup ничем не отличается от обычной фиксации, за исключением того, что комментарию предшествует "fixup!".

Интересно, как и где git отслеживает тот факт, что commit B - это фиксация фиксации, отмеченная <commit A's hash>, если это вообще происходит; и если это так, есть ли git log эквивалент, который позволяет мне получить доступ к <commit A's hash> вместе с commit B?

Спасибо!

1 Ответ

0 голосов
/ 16 января 2019

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

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

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

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

...