Eu aprendi recentemente que, ao mesclar duas ramificações no git, se houver alterações em duas linhas adjacentes , o git declara isso um conflito. Por exemplo, se o arquivo test.txt
tiver este conteúdo:
Line 1: A
Line 2: B
Line 3: C
Line 4: D
e no ramo master
mudamos isso para
Line 1: A
Line 2: B1
Line 3: C
Line 4: D
enquanto no ramo testing
, mudamos isso para
Line 1: A
Line 2: B
Line 3: C1
Line 4: D
e depois tentar fundir testing
em master
, git declara um conflito de mesclagem. Minha ingênua expectativa era que a fusão ocorresse sem conflito e produzisse o seguinte:
Line 1: A
Line 2: B1
Line 3: C1
Line 4: D
Estou certo de que há uma boa razão pela qual o git não se funde dessa maneira. Alguém pode explicar esse motivo?
Respostas:
Supondo que esse trecho de código
foi alterado em um ramo para este
e em outro ramo neste
então eu não gostaria que o git mesclasse isso
sem me alarmar.
Para evitar causar tais problemas, o git geralmente se recusa a mesclar automaticamente as alterações que tocam nas linhas próximas. Permite verificar se a lógica do programa estaria quebrada ou não.
Este exemplo é trivial, mas ao mesclar ramificações enormes, o risco de conflitos "lógicos" semelhantes é muito maior. Às vezes, eu adoraria que o contexto fosse ainda maior do que é atualmente.
fonte
Esse comportamento é apenas para git?
Depois de discutir com um colega, tentei, e o SVN lida com isso sem problemas: você modifica as duas linhas.
Os recursos de mesclagem de vários VCS são testados aqui para bazar, darcs, git e mercurial : https://github.com/mndrix/merge-this
Parece que apenas os dardos mesclam com êxito o caso "linhas adjacentes".
A aplicação de alterações adjacentes aos arquivos não é um problema difícil. Eu realmente acho que esse comportamento foi escolhido de propósito.
Por que alguém decidiria que modificar linhas adjacentes produz um conflito?
Eu acho que isso é forçar você a olhar para ele .
Modif número 1, no mestre:
Modif número 2, mesclado de uma filial:
Após a mesclagem, você não deseja isso:
Vendo esse comportamento como um recurso
Você pode transformar o comportamento de mesclagem do git em vantagem. Quando você precisar manter duas linhas consistentes, mas não conseguir detectá-las (no momento da compilação, no início dos testes ou de outra forma), tente juntar-se a elas.
Reescreva isso ...:
...para isso:
Então, quando você mescla o Modif 1 ...:
... com o Modif 2 ...:
..., o git produzirá um conflito, e você forçará você a olhar para ele.
fonte
Estou adivinhando, mas acho que tem a ver com a linha 2 ser usada como contexto para a mudança da linha 3.
O Git não pode simplesmente dizer que "A linha com C se tornou uma linha com C1" porque poderia haver outra linha com "C", então diz "A linha com C, logo após o início do arquivo, a linha com A, e a linha com B, agora é C1 "
Se "a linha com B" não estiver mais lá, parte do contexto será perdida, e o git pode dizer apenas aonde a nova linha deve ir.
fonte
As outras respostas aqui são importantes, mas para mim isso sempre pareceu uma limitação desnecessária.
Como outros já disseram, nesses casos, você definitivamente não gostaria que o Git mesclasse as linhas sem aviso.
Mas eu ainda queria a opção de fazer isso automaticamente, depois de ser avisado. Então, escrevi um driver de mesclagem git personalizado que pode mesclar conflitos em linhas adjacentes (ou individuais) interativamente:
Isso economiza muito tempo, pois gerencio um projeto em que as pessoas geralmente trabalham nos mesmos arquivos e refatoram muito código.
O script está disponível no GitHub sob uma licença GPLv3 +. Talvez você ache útil:
https://github.com/paulaltin/git-subline-merge
fonte