2
respostas

Resolvendo Conflitos: Merges

Foi falado na vídeo-aula que o Git consegue dar merge quando as alterações do local e do remoto são em linhas diferentes. Já em linhas iguais, os conflitos devem ser resolvidos manualmente.

Mas e se as alterações no mesmo arquivo forem dentro de um 'IF' ou de um 'FOR', por exemplo. Maria alterou a condição do if (linha 1) e Leandro alterou linhas de instruções dentro do if (linhas 4, 5, 6 ... 10). O que acontece?!

Sei que a boa comunicação entre a equipe deve ocorrer nessas horas, mas sobre o Git, ele consegue interpretar que alterar linhas dentro de um if ou de algum método mais complexo num merge é algo perigoso? Ou o principio básico desse merge é apenas igualdade/desigualdade de linhas?

2 respostas

Vamos lá, o conflito é assim, é da maneira que você está pensando, vou dar um exemplo meu, programo em php com o codeigniter, tinha uma query que um cara tinha feito, e estava errada, estava errada porque o sinal estava errada, então estava tipo, WHERE talcoisa > 10, mas na verdade era WHERE talcoisa < 10, dai arrumei e dei o merge, dai deu conflito e eu tinha que resolver, pq tinha 2 soluções, a primeira que era dele, e aa minha, dai eu tive que analisar qual era a correta, selecionar e dar merge, quando acontece os conflitos você para e analisa qual é correto, a partir disso você seleciona o correto e da andamento.

Então, a dúvida foi o contrário, quando as alterações são em linhas diferentes. Vou colocar em um outro exemplo qualquer:

if(var1 != var2 + 1 && var2 == var3 || var3 == var1 * 21){ //Linha1
    doSomething1; //Linha2
    doSomething2; //Linha3
    doSomething3; //Linha4
    if(algo == algo2 * 2){ //Linha5
        doSomething4; //Linha6
    }
}

Maria altera a condição do if (linha 1) e Leandro altera linhas de instruções dentro do if (linhas 2, 4 e 5 (condição de um outro if)).

No final o código vai dar merge automaticamente, já que as linhas alteradas não foram as mesmas. Não houve conflito.

  • Maria mudou o multiplicador da condição da Linha1 para 25 pra arrumar uma regra de negócio que foi modificada:
if(var1 != var2 + 1 && var2 == var3 || var3 == var1 * 25){ //Linha1
  • Leandro mudou as outras linhas para arrumar alguns bugs (nada a ver com a alteração da Maria, porém a mudança dela vai mudar toda a lógica):
    leandroMudouTudo1; //Linha2
    leandroMudouTudo2; //Linha4
    if(leandroMudouAlgo != leandroMudouAlgo2 * 5){ //Linha5

Enfim, não deu conflito, já que são linhas diferentes e o merge foi completo automaticamente com sucesso. Mas ficou tudo bugado agora, já que foram alterações completamente diferentes dentro de uma estrutura de lógica.

A dúvida foi a seguinte: Tem a possibilidade (ou alguma condição) do Git dar conflito quando as mudanças forem em linhas diferentes, como nessas ocasiões, ou a única regra para o conflito acontecer é a 'alteração da mesma linha'? Pois como no exemplo, mudanças em linhas diferentes dentro de um IF ou algo mais complexo, podem !@#$% tudo se o merge for automático do 'git pull'. Apesar de que é só voltar as versões se der ruim, justamente o que o Git oferece, hahaha.