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.
2º passo: Clique em New Branch
3º passo: No modal que irá abrir, dê um nome para a sua branch e clique em Create branch
4º passo: Clique no nome de sua branch para navegar até ela
5º passo: Clique no arquivo de funções
6º passo: Vamos agora editar esse arquivo no próprio Github
7º passo: Depois de editar e commitar o seu arquivo, ele ficará mais ou menos assim
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.
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:
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.
Tente mergear novamente a branch feature/calcularPrecoComDesconto
...
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.
Clique em Resolve Conflicts e você será redirecionado para a seguinte tela:
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
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!!!