Atualmente, estou trabalhando para uma empresa que usa o VSTS para gerenciar código git. A maneira "recomendada" da Microsoft de mesclar uma ramificação é fazer uma "mesclagem de squash", o que significa que todas as confirmações dessa ramificação são comprimidas em uma nova confirmação incorporando todas as alterações.
O problema é que, se eu fizer algumas alterações em uma ramificação para um item da lista de pendências, imediatamente quiser começar a fazer alterações em outra ramificação para outro item da lista de pendências, e essas alterações dependem do conjunto de alterações da primeira ramificação?
Posso criar uma ramificação para esse item da lista de pendências e baseá-la na primeira ramificação. Por enquanto, tudo bem. No entanto, quando chega a hora de criar uma solicitação de recebimento para o segundo ramo, o primeiro ramo já foi mesclado no mestre e, como foi feito como uma mescla de squash, o git sinaliza vários conflitos. Isso ocorre porque o git não vê os commits originais dos quais o segundo ramo foi baseado, apenas vê uma grande mistura de squash e, portanto, para mesclar o segundo branch para dominar, ele tenta reproduzir todos os commits do primeiro branch em mesclagem no topo da squash, causando muitos conflitos.
Portanto, minha pergunta é: existe alguma maneira de contornar isso (além de nunca basear uma ramificação de recurso em outra, o que limita meu fluxo de trabalho) ou a mesclagem de squash apenas quebra o algoritmo de mesclagem do git?
feature1
no mestre e depois mesclarfeature2
mais tarde. Nesse caso, a primeira abordagem não resultaria em conflitos, já que o git tenta reaplicar osfeature1
commits no topo do commit squashed, enquanto o segundo permitiria ao git determinar que esses commits não precisam ser mesclados?git clone
inserindo o repositório e copiando meus arquivos alterados!) Porque ramifiquei de uma ramificação e, em seguida, o mantenedor esmagou a primeira ramificação. No meu trabalho, eles também fazem fusões de squash. Isso significa que não posso trabalhar em um recursob
que depende delea
até que o recursoa
seja mesclado.A mesclagem de squash quebra o algoritmo de mesclagem de quaisquer ramificações que contenham quaisquer confirmações que foram removidas pela squash. Dito de outra forma, os rebotes são virais. Se você refazer uma ramificação, precisará refazer qualquer outra ramificação que dependesse dessa ramificação. Se você usar o redirecionamento , os conflitos de mesclagem que você resolveu manualmente em seu repositório local não precisarão ser resolvidos manualmente novamente, mas isso não ajudará nos conflitos resolvidos por outras pessoas.
É por isso que nossa regra não escrita aqui é aceitável esmagar, desde que ninguém mais dependa do ramo de recursos, o que ocorre talvez 90% das vezes. Caso contrário, uma mesclagem direta ajuda todos a evitar problemas.
fonte
feature-xyz
ramo. Você pode criar umafeature-xyz-squashed
ramificação iniciando na mesma confirmação quefeature-xyz
ramificação,git cherry-pick
as confirmações defeature-xyz
parafeature-xyz-squashed
, esmagá-las lá e mesclarfeature-xyz-squashed
paramaster
. Você não deve mesclarfeature-xyz
então. Às vezes, o acima mencionado faz sentido (por exemplo, você não deseja incluir confirmações com uma senha oculta), mas é uma solução alternativa, dificilmente uma prática recomendada.