Aprender GIT é fácil e vou te provar isso (Parte 6)

E ai, escoteiro, já está conseguindo enxergar como o Git e o Github podem facilitar sua vida na hora de visionar seus projetos? Vamos então seguir com o nosso curso falando de um evento bem comum que acontece no dia-a-dia de todo desenvolvedor que trabalhar em equipe, o famoso: "Conflito de merge".

Vamos a um exemplo para ilustrar esse problema...

Imagine que você trabalha em uma equipe que dá manutenção em no sistema XPTO (Nome aleatório). Na equipe trabalha com você o Pedrinho.

Pedrinho criou uma nova branch a partir da master chamada: "feature/calcularPrecoComDesconto" e escreveu a seguinte função:

function calcularPrecoComDesconto(float $precoProduto) {
    $desconto = 15;
    return $precoProduto - ($precoProduto * $desconto / 100);
}

Porém você percebeu que a função está engessada, ou seja, ela só calcula um desconto fixo de 15%, e você quer deixar essa função mais dinâmica. Então você cria uma nova branch a partir da feature/calcularPrecoComDesconto, dá a ela o nome de feature/calcularPrecoComDescontoMelhoria e faz a seguinte alteração:

function calcularPrecoComDesconto(float $precoProduto, $desconto) {
    return $precoProduto - ($precoProduto * $desconto / 100);
}

Ou seja, agora a função calcularPrecoComDesconto também recebe como parâmetro o percentual do desconto a ser aplicado.

Porém nesse meio tempo Pedrinho também percebe que a função dele está engessada e resolve atualizar o código, mas diferente de você, ele coloca o desconto como parâmetro opcional, e caso nenhum desconto seja informado, ele considerará o valor 15. Ele fez isso para não precisar mexer nos vários pontos do programa que já chamavam a função.

function calcularPrecoComDesconto(float $precoProduto, $percentualDeDesconto = 15) {
    return $precoProduto - ($precoProduto * $percentualDeDesconto / 100);
}

Pedrinho faz merge da branch dele e você faz merge da sua branch. E ai? qual versão do código o Git vai manter? A primeira versão mergeada ou a segunda versão mergeada?

A resposta na verdade é: O Git não sabe o que fazer, e é você que precisa resolver isso.

Simulando um conflito de merge

1º passo: Navegue até a raiz do seu repositório no Github e clique no botão que permite visualizar todas as suas branches.

image.png

2º passo: Clique em New Branch

image.png

3º passo: No modal que irá abrir, dê um nome para a sua branch e clique em Create branch

image.png

4º passo: Clique no nome de sua branch para navegar até ela

image.png

5º passo: Clique no arquivo de funções

image.png

6º passo: Vamos agora editar esse arquivo no próprio Github

image.png

7º passo: Depois de editar e commitar o seu arquivo, ele ficará mais ou menos assim

image.png

Agora que já temos uma alteração commitada por "um Dev" do nosso time, vamos agora agir como sendo "outro Dev".

8º passo: Vá no seu terminal, baixe as branches remotas para a sua máquina e navegue até a branch feature/calcularPrecoComDesconto:

git fetch -pt
git checkout feature/calcularPrecoComDesconto

O comando git fetch -pt sincroniza os ramos remotos com os ramos locais.

9º passo: Como já temos as "alterações do Pedrinho" em nossa máquina, vamos criar nossa branch a partir da branch dele.

git checkout -b feature/calcularPrecoComDescontoMelhoria

10º passo: Vamos agora alterar o arquivo de funções como vimos anteriormente.

<?php

function obterIniciais(string $nomeCompleto) {
    $partes = explode(" ", $nomeCompleto);
    $iniciais = array_map(function($nome) { 
        return $nome[0]; 
    }, $partes);

    return strtolower(implode("", $iniciais));
}

function calcularPercentual($total, $percentual) {
    return $total * $percentual / 100;
}

function calcularArea($base, $altura) {
    return $base * $altura;
}

function calcularPrecoComDesconto(float $precoProduto, $desconto) {
    return $precoProduto - ($precoProduto * $desconto / 100);
}

11º passo: Vamos então, adicionar nosso arquivo ao Stage, commitar nossas alterações e enviar tudo para o Github.

git add .
git commit -m "Melhora função de calcular desconto"
git push origin feature/calcularPrecoComDescontoMelhoria

Temos agora nossas duas branchs no Github.

image.png

O que será que acontece se tentarmos mergear as duas com a master?

Como é possível ver, não há nenhuma problema ao tentarmos mergear a branch feature/calcularPrecoComDesconto com a master:

image.png

Então vamos mergear também a feature/calcularPrecoComDescontoMelhoria com a master e na sequência vamos novamente alterar nossa branch feature/calcularPrecoComDesconto na própria interface do Github.

image.png

Tente mergear novamente a branch feature/calcularPrecoComDesconto...

image.png

O Github está nos informando que ele não pode fazer um merge automático porque ele não sabe o que fazer com as alterações que fizemos 😔.

Mas como nós somos "Vida Loka" a gente vai criar a Pull Request e confirmar o merge assim mesmo.

O Github vai lhe mostrar isso.

image.png

Clique em Resolve Conflicts e você será redirecionado para a seguinte tela:

image.png

Aqui você poderá atualizar o seu código deixando o bloco que você achar mais interessante, porém não esqueça de remover os caracteres textuais que o Github criou.

<<<<<<< feature/calcularPrecoComDesconto
=======
>>>>>>> master

Após atualizar seu código clique em Mark as resolved

image.png

Porém, em 99% das vezes não é interessante corrigir conflitos pela interface do Github, visto que geralmente várias partes do seu código conflitam e resolver por lá é bem chatinho.

Para resolver em sua máquina, siga o passo-a-passo em seu terminal:

1º Passo: Sincronize novamente suas branchs remotas com as locais

git fetch -pt

2º Passo: Navegue até a branch feature/calcularPrecoComDesconto e baixe as atualizações dela

git checkout feature/calcularPrecoComDesconto
git pull origin feature/calcularPrecoComDesconto

3º Passo: Navegue até a branch master e realize o merge

git checkout master
git merge feature/calcularPrecoComDesconto

Você receberá a seguinte mensagem no Terminal:

Auto-merging funcoes.php
CONFLICT (content): Merge conflict in funcoes.php
Automatic merge failed; fix conflicts and then commit the result.

Isso significa que você fez o merge, mas ele precisa ter os conflitos resolvidos.

O novo conteúdo do seu código será:

<?php

function obterIniciais(string $nomeCompleto) {
    $partes = explode(" ", $nomeCompleto);
    $iniciais = array_map(function($nome) { 
        return $nome[0]; 
    }, $partes);

    return strtolower(implode("", $iniciais));
}

function calcularPercentual($total, $percentual) {
    return $total * $percentual / 100;
}

function calcularArea($base, $altura) {
    return $base * $altura;
}

<<<<<<< HEAD
function calcularPrecoComDesconto(float $precoProduto, $desconto) {
    return $precoProduto - ($precoProduto * $desconto / 100);
=======
function calcularPrecoComDesconto(float $precoProduto, $percentualDeDesconto = 15) {
    return $precoProduto - ($precoProduto * $percentualDeDesconto / 100);
>>>>>>> feature/calcularPrecoComDesconto
}

Vamos resolver os conflitos

<?php

function obterIniciais(string $nomeCompleto) {
    $partes = explode(" ", $nomeCompleto);
    $iniciais = array_map(function($nome) { 
        return $nome[0]; 
    }, $partes);

    return strtolower(implode("", $iniciais));
}

function calcularPercentual($total, $percentual) {
    return $total * $percentual / 100;
}

function calcularArea($base, $altura) {
    return $base * $altura;
}

function calcularPrecoComDesconto(float $precoProduto, $percentualDeDesconto = 15) {
    return $precoProduto - ($precoProduto * $percentualDeDesconto / 100);
}

Agora basta você adicionar a stage, commitar e subir

git add .
git commit -m "Merge branch 'feature/calcularPrecoComDesconto'"
git push origin master

Prontinho, conflito resolvido.

Pode parecer que é muita coisa, mas lembre-se que a maioria dos passos acima foram para a gente simular um conflito. Na vida real não precisaremos fazer tudo isso, precisaremos apenas resolver o conflito.

Espero que esse material tenha sido útil para você, escoteiro!

Até a próxima!!!