Pular para o conteúdo
</>RoByte

Buscar cursos e aulas

Aulas do curso

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:

  1. Abra o arquivo, decida o que fica e apague os marcadores.
  2. Prepare o arquivo resolvido com git add arquivo.
  3. 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.