Git слияние сквоша и повторяющиеся конфликты

У меня есть репозиторий git с ветвями master и alt. ветвь alt содержит измененную версию кода master, и я пытаюсь объединить изменения от master до alt следующим образом:

git merge --squash master

Объединить результаты в конфликте:

Auto-merging myproject/foo/bar
CONFLICT (content): Merge conflict in myproject/foo/bar
Squash commit -- not updating HEAD
Automatic merge failed; fix conflicts and then commit the result.

После разрешения конфликтов и фиксации изменений все кажется прекрасным, но когда я снова запустил git merge --squash master (без каких-либо изменений в каких-либо ветвях), я получу ту же ошибку конфликта.

Почему? Что я пропустил?

Ответ 1

В squash слияние, вы создали коммит, который имеет эффект, но на самом деле не является слиянием.

То есть, у рабочего дерева есть изменения, которые вы ожидаете, но метаданные не имеют особого значения: критически, у коммита нет двух родителей (один на master и один на alt), и поэтому последующее слияния не могут определить последнего общего предка.


Полезные применения squash

  • слияние полностью завершенной ветки функций на master. Я буду накапливать любую полезную информацию в сжатом коммите, но специально не хочу, чтобы эта инкрементальная история развития этой функции загрязняла временную шкалу master commit.
  • объединение нескольких независимых функций (или вкладов от разных разработчиков) на одну и ту же ветку интеграции, без сохранения их инкрементных историй. Я мог бы переустановить их все вместе, а затем использовать rebase -i для раздачи своих коммитов, но это проще.

Бесполезное использование squash

Любое слияние, в котором вы хотите сохранить историю метаданных истории и родословной, например, в любое время, когда вы хотите, чтобы повторяющиеся рекурсивные слияния работали правильно, в частности, что пытается сделать OP.

squash просто не является хорошим по умолчанию, поэтому он не является стандартным.