Vídeo em breve
Por enquanto, esta aula está disponível só em texto — o vídeo entra assim que ficar pronto.
Git no seu computador
Branches e merge
Trabalhar em linhas paralelas do projeto sem quebrar o que já funciona, juntar o resultado com merge e resolver conflitos. · 18 min
Imagine que o seu projeto funciona e você quer testar uma ideia arriscada. Se você mexer direto nos arquivos e der errado, estraga o que estava bom. Com branches (ramos), você cria uma linha paralela do projeto, testa tudo lá e só junta com a versão principal se der certo.
A branch principal, criada por padrão, costuma se chamar main. Uma
branch é apenas um ponteiro leve para um commit, então criar e apagar
branches é barato e rápido.
Comandos básicos
git branch # lista as branches (a atual tem um *)
git switch -c nova-funcao # cria a branch "nova-funcao" e vai para ela
# ... edita arquivos e faz commits normalmente ...
git switch main # volta para a main
Enquanto você está na nova-funcao, tudo que commitar fica só nela. A
main continua intacta, e ao voltar para ela os arquivos mudam de volta
como se nada tivesse acontecido.
Dica
Em materiais mais antigos você vai ver git checkout nome-da-branch e
git checkout -b nome. Eles fazem o mesmo que git switch e
git switch -c. Os comandos switch são mais novos e mais claros.
Juntando: merge
Quando a ideia deu certo, você traz as mudanças para a main. Vá para a
branch que vai receber e peça o merge da outra:
git switch main
git merge nova-funcao
git branch -d nova-funcao # apaga a branch, que já cumpriu o papel
Se a main não teve nenhum commit novo enquanto você trabalhava, o Git
apenas avança o ponteiro (fast-forward). Se teve, ele cria um commit
de merge que junta as duas linhas.
Conflitos
Um conflito acontece quando as duas branches mudaram o mesmo trecho do mesmo arquivo, e o Git não sabe qual versão manter. Ele não escolhe por você: para o merge e marca o arquivo assim:
<<<<<<< HEAD
print("Olá, mundo!")
=======
print("Oi, mundo!")
>>>>>>> nova-funcao
O trecho entre <<<<<<< e ======= é a versão da branch atual, e o trecho
até >>>>>>> é o da branch que você está juntando. Para resolver:
- Abra o arquivo, decida o que fica e apague os marcadores.
- Prepare o arquivo resolvido com
git add arquivo. - Conclua com
git commit.
Atenção
Conflito não é erro seu, é uma situação normal quando várias pessoas (ou
várias branches) mexem no mesmo lugar. O erro comum é deixar os
marcadores <<<<<<< dentro do arquivo e commitar assim. Sempre releia o
arquivo e rode o código antes de concluir o merge.
Visualizando o histórico
git log --oneline --graph --all
Esse comando desenha as branches e os merges em formato de árvore, ótimo para entender o que aconteceu.
Exercícios
Exercício
1. Aquecimento. Crie uma branch experimento, faça um commit nela,
volte para a main e confirme que o arquivo alterado voltou ao estado
anterior. Depois faça o merge e apague a branch.
Exercício
2. Conflito de propósito. Em um arquivo, mude a mesma linha em duas branches diferentes e faça o merge de uma na outra. Resolva o conflito mantendo um texto que combine as duas versões e conclua o merge.
Exercício
3. Desafio. Crie três branches a partir da main, cada uma com um
commit diferente em arquivos diferentes, e faça o merge das três na
main. Rode git log --oneline --graph --all e descreva o desenho que
apareceu.