git squash для merge Слияние веток с объединением коммитов/ Сквош

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

Squash при merge

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

Выглядеть это может, например так:

  1. Обновляем обе ветки (если нужно, мастер часто нужно):
    git fetch origin master
    git fetch origin имяВашейВетки
  2. Создаем клон мастера
    git checkout -B master-new origin/master
  3. Вливаем в созданный клон со сквошем нашу ветку с задачей
    git merge --squash origin/имяВашейВетки
  4. Коммитим изменения - в них попадут все объединенные изменния из вашей ветки (все чем она отличается от мастер/клона мастера):

    git commit -m 'Сообщение коммита'
  5. Проверяем что все окей, и выполняем форсированный пуш (внимание! это затирает изменения во внешней ветке, возможна потеря изменений, если в текущей ветке что-то не так, но тут иначе никак) в ветку MR/PR внешнего репозитория (там где в конечном итоге ее вольют в мастер):
    git push --force -u origin master-new:имяВашейВетки

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

Как вернуть и продолжить работать с имяВашейВетки

В последнем действии в инструкции выше:

git push --force -u origin master-new:имяВашейВетки

-- мы находимся на ветке master-new (фактически мы перезаписали ее с во внешем репозитории остоянием master-new), но что если нам нужно вернуться к своей ветке и продолжить работу?

Сейчас во внешнем репозитории у нас в ветке имяВашейВетки только 1 коммит, в то время как в локальном в той же ветке имяВашейВетки их может быть много, чтобы синхронизировать состояние веток, действуем так (как и в общей инструкции отката состояния к внешнему):

git checkout имяВашейВетки
git fetch origin имяВашейВетки
git reset --hard  origin/имяВашейВетки

- готово, можно продолжать работать, ветки синхронизированы

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