Ситуация, которую вы описываете, требует, чтобы история выглядела примерно так:
--X--Y <-- your master
\
A--B--C--D <-- feature01
\
R--S--T <-- feature02
(независимо от того, имеет ли ваш master
коммит Y
или все еще на X
, не имеет значения для следующего.)
Почему это так?
Обратите внимание, что две функции имеют общие коммиты, A
в этом примере. Когда вы делаете регулярные слияния, Git знает об этом факте и может справиться с ним, не вызывая конфликтов. В частности, во втором слиянии не снова будет извлекать изменения, сделанные в A
.
Но когда вы выполняете сква sh слияние feature01
, вы генерируя эту историю:
--X--Y--F1 <-- your master
\
A--R--S--T <-- feature02
Я обрезал feature01
из картинки, потому что она больше не играет роли.
Когда вы делаете слияние feature02
сейчас (squa * 1051) * или обычный не имеет значения) Git пытается применить коммит A
снова, потому что у него недостаточно информации, чтобы знать, что он уже слил его. Конфликты возникают, когда один из коммитов B
, C
, D
внес изменения в окрестности изменений, которые A
сделал.
Как заставить merge --squash
работать (последующее слияние работает нормально)?
Вы не можете. Не используйте merge --squash
.
Конечно, вы можете перепрыгнуть через некоторые обручи по истории прививания , чтобы сделать вид, что A
действительно было объединено в F1
; но это всего лишь обходной путь, лейкопластырь для экстренных случаев, но это слишком утомительно для обычного рабочего процесса. И если вы делаете это, то почему вы не использовали регулярное слияние?