git rebase Как это работает - куда дозаписываются коммиты

Коммиты из "вливаемой" ветке при rebase записываются перед коммитами текущей ветки.

Практика

Посмотрим на практике:

  1. Создадим тестовый репоизторий с двумя ветками
  2. Переключимся на новую неосновную ветку:
    git checkout newbranch
  3. Посмотрим ее список коммитов:
    git log --oneline --name-only

    Получим:

    4ac039a (HEAD -> newbranch) newbranch cmt 1
    somefile.txt
    a2ec666 master cmt 2
    somefile.txt
    6dd2199 master cmt 1
    somefile.txt
    
  4. Сделаем rebase:
    git rebase master

    И теперь уже история:

    git log --oneline --name-only

    покажет нам что коммит, сделанный в мастере позже последнего коммита текущей ветки, оказался перед ним:

    019bc56 (HEAD -> newbranch) newbranch cmt 1
    somefile.txt
    4394661 (master) master cmt 3
    somefile.txt

    a2ec666 master cmt 2
    somefile.txt
    6dd2199 master cmt 1
    somefile.txt

Готово! Репозиторий переведен в состояние, описанное в начале этой заметки.
ОБРАТИТЕ ВНИМАНИЕ: после ребейза хэш коммита newbranch cmt 1 изменился с
4ac039a на 019bc56 -- т.е. фактически это новый коммит.
-- это сильный минус подхода с rebase, из-за этого вы не сможете просто запушить ветку, если до ребейза она была зщапушена, вам придется:

  • либо сначала делать пулл - получая двойной набор коммитов.
  • либо затирать историю ветки во внешнем репоизтории форсированным пушем

Key Words for FKN + antitotal forum (CS VSU):