Git Rebase создает нелинейную историю
В репозитории Git есть только master, и все работают над ним (пока не судите, это мелочь) с включенной Rebase по умолчанию. AFAIK git-rebase переписывает историю, применяя коммиты по одному на основе даты и переходя в состояние MERGING, когда это необходимо во время этого процесса. Но одна вещь раздражает меня и команду, история иногда не линейна, вот несколько примеров:
Что бы здесь происходило? Или я неправильно понимаю, как работает git-rebase?
1 ответ
История не основана на датах, она основана на основном графике, на котором основан Git. Например, ваша история может выглядеть так:
branchA
↓
* -- * -- * -- * -- *
\
* -- * -- *
↑
branchB
Каждый из тех *
представляет коммит в вашей истории, но фактическая дата совершенно не зависит от местоположения на графике. Давайте заменим звездочки числами, чтобы показать относительное время их создания (большие числа будут созданы позже):
branchA
↓
1 -- 2 -- 4 -- 5 -- 8
\
3 -- 6 -- 7
↑
branchB
Это совершенно точная и "линейная" (по времени) история для каждой ветви. Если вы регистрируете историю для branchA
, ты получаешь 8, 5, 4, 2, 1
; за branchB
ты бы получил 7, 6, 3, 2, 1
,
Теперь, если вы перебазируете branchB
на branchA
Git перепишет эти коммиты на branchB
и применить их на branchA
, При переписывании Git по умолчанию сохраняет время создания без изменений (но сбрасывает время фиксации до текущего времени). Таким образом, вы получите следующий результат:
branchA
↓
1 -- 2 -- 4 -- 5 -- 8 -- 3' -- 6' -- 7'
↑
branchB
(The '
здесь означает, что они на самом деле отличаются от оригинальных коммитов, но имеют одинаковое содержание и время автора).
Если вы сейчас посмотрите на журнал для branchB
, вы получите следующее: 7', 6', 3', 8, 5, 4, 2, 1
, И именно отсюда и возникает "парадокс времени": у вас есть совершенно линейная история (график для этого раздела линейный); но коммиты не обязательно в том порядке, в котором они были изначально созданы.
Это совершенно нормально и полностью по своему замыслу: перебазирование не должно полностью сбрасывать коммиты, поэтому информация об авторе (кто это сделал и когда они это сделали) все еще там.