git squash для rebase. Перебазирование с объединением коммитов. Сквош

Еще есть squash для merge

Squash при rebase-е

У этого вариант:

  • Плюс - не надо создавать никаких дополнительных веток (есть только ваша текущая и мастер, причем тут нам не важно в каком стоянии мастер, он тут нужен просто как точка отсчета не клонируем его, как в варианте с merge)
  • В это варианте нам, не важно в каком стоянии теперь находится мастер, он тут нужен просто как точка отсчета и нам подойдет даже его устаревшее состояние. Мы не клонируем его, как в варианте с merge
  • Минус - нужно будет немножко посмотреть на историю коммитов, также если вы уже вливали множество других коммитов из мастера, разобраться с тем что именно объединять будет не очень просто

Действуем так:

  1. Итак, мы находимся на своей текущей ветке, смотрим что там за изменения:
    git log --oneline

    например, видим:

    05711cd (HEAD -> master) 4 ch
    c3ae0d8 3 ch
    ee85b99 2 ch
    d0f55f9 first ch
    15122d2 init repo

    -- тут 5 коммитов

  2. Давайте объединим последние три коммита в один, для этого укажем отступ от HEAD в команде ребейза с интерактивным режимом -i:
    git rebase -i HEAD~3

    --где ~3 как раз и указывает, на то что мы хотим в ребейзе как-то поработать с последними тремя коммитами

  3. После выполнения команды откроется текстовый редактор (в линуксе это часто nano), в котором ребез по умолчанию просто берет все (мы выбрали последние три) коммиты командой pick:
    pick 2464840 2 ch
    pick 87deb8f 3 ch
    pick f966973 4 ch
    
    # Rebase d0f55f9..f966973 onto d0f55f9 (3 commands)
    #...........
    

    -- фактически это текстовая инструкция для git-а как именно проводить rebase, далее мы исправим ее, в этих исправлениях и будет использован squash

  4. Объединим два последним коммита с первым из выбранных трех, пометим их с помощью s (можно и полно squash) в открытом текстовом редакторе:
    pick 2464840 2 ch
    s 87deb8f 3 ch
    s f966973 4 ch
    
    # Rebase d0f55f9..f966973 onto d0f55f9 (3 commands)
    #...........
    

    Сохраним файл.

  5. После сохранения файла в тестовом редакторе (часто это консоль) откроется редактирование сообщение коммита, ведь теперь наш коммит содержит больше изменений, и нам дают возможность прокомментировать это, изначально редактор будет выглядить как-то так:
    # This is a combination of 3 commits.
    # This is the 1st commit message:
    
    2 ch
    
    # This is the commit message #2:
    
    3 ch
    
    # This is the commit message #3:
    
    4 ch
    ..........
    

    -- в дело пойдут только незакомментированные (без решеток) строки, отредактируем сообщение, например так:

    # This is a combination of 3 commits.
    # This is the 1st commit message:
    
    2 ch, 3 ch, 4 ch
    ..........
    

    -- тут мы просто перенесли все на одну строчку, в вашем случае решайте как лучше. И сохраним "файл" сообщения коммита.

  6. Готово! Выбранные коммиты объединены, убедимся в этом, опять посмотрев историю:
    git log --oneline
    

    для примера выше увидим:

    72b457e (HEAD -> master) 2 ch, 3 ch, 4 ch
    d0f55f9 first ch
    15122d2 init repo