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 на branchAGit перепишет эти коммиты на branchB и применить их на branchA, При переписывании Git по умолчанию сохраняет время создания без изменений (но сбрасывает время фиксации до текущего времени). Таким образом, вы получите следующий результат:

                  branchA
                    ↓
1 -- 2 -- 4 -- 5 -- 8 -- 3' -- 6' -- 7'
                                     ↑
                                  branchB

(The ' здесь означает, что они на самом деле отличаются от оригинальных коммитов, но имеют одинаковое содержание и время автора).

Если вы сейчас посмотрите на журнал для branchB, вы получите следующее: 7', 6', 3', 8, 5, 4, 2, 1, И именно отсюда и возникает "парадокс времени": у вас есть совершенно линейная история (график для этого раздела линейный); но коммиты не обязательно в том порядке, в котором они были изначально созданы.

Это совершенно нормально и полностью по своему замыслу: перебазирование не должно полностью сбрасывать коммиты, поэтому информация об авторе (кто это сделал и когда они это сделали) все еще там.

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