// aula 04 · Git & GitHub

Merge — Unindo
branches e resolvendo conflitos


O que é merge?

🤝 Unindo duas linhas do tempo

Merge é o processo de integrar o histórico de uma branch em outra. Quando você termina de desenvolver uma feature numa branch separada, faz o merge dela na main para o código entrar no projeto principal.

Fast-Forward Merge

Acontece quando a main não teve nenhum commit novo desde que a feature branch foi criada. O Git simplesmente "avança" o ponteiro da main. Sem commit de merge extra — histórico linear e limpo.

3-Way Merge

Acontece quando ambas as branches tiveram commits. O Git cria um merge commit que une os dois históricos. O commit tem dois pais — aparece como bifurcação no git log --graph.

# 1. Ir para a branch que vai RECEBER o merge (geralmente main)
git switch main

# 2. Fazer o merge
git merge feature/login

# Forçar um merge commit mesmo sendo fast-forward (mantém histórico)
git merge --no-ff feature/login

# 3. Deletar a branch após o merge
git branch -d feature/login

Conflitos de merge — como resolver

⚠️ Quando o Git não consegue decidir sozinho

Um conflito ocorre quando duas branches modificaram a mesma parte do mesmo arquivo. O Git para o merge e marca os conflitos no arquivo para você resolver manualmente.

// arquivo com conflito — o que você vê no editor:

<<<<<<< HEAD (sua branch atual)
    print("Olá, Lucilia!")
=======
    print("Olá, mundo!")
>>>>>>> feature/login (branch sendo integrada)
# Ver quais arquivos têm conflito
git status

# Após editar e resolver manualmente os conflitos:
git add arquivo-resolvido.py
git commit -m "merge: resolve conflito em arquivo-resolvido.py"

# Abortar o merge e voltar ao estado anterior
git merge --abort

🛠️ Como resolver conflitos na prática

  • Abra o arquivo conflitante no VS Code — ele mostra os dois lados com botões "Accept Current" / "Accept Incoming"
  • Remova as marcações <<<<<<<, ======= e >>>>>>> e deixe só o código correto
  • Às vezes a solução é juntar as duas versões, não escolher uma
  • Após resolver todos os arquivos, faça git add . e git commit

Rebase — uma alternativa ao merge

Merge

Une o histórico preservando todos os commits de ambas as branches. Cria um merge commit extra. Histórico mais completo, mas pode ficar "sujo" com muitas bifurcações.

Rebase

Reescreve o histórico da feature branch como se ela tivesse sido criada a partir do último commit da main. Histórico linear e limpo, mas altera os hashes dos commits.

# Rebase da feature branch em cima da main
git switch feature/login
git rebase main

# Rebase interativo — reescrever os últimos N commits
git rebase -i HEAD~3

# Abortar o rebase em caso de conflito
git rebase --abort

# Continuar após resolver conflito durante rebase
git add .
git rebase --continue

⚠️ Regra de ouro do Rebase

Nunca faça rebase de commits que já foram enviados para um repositório público (git push). O rebase reescreve o histórico — se outros já baixaram esses commits, você causará conflitos sérios para eles.


Git Stash — guardando trabalho incompleto

🗃️ Salva temporariamente sem fazer commit

O stash é como uma "gaveta temporária" — guarda as alterações não commitadas para você poder trocar de branch sem perder o trabalho.

# Guardar alterações na gaveta (stash)
git stash
git stash push -m "trabalho em progresso no login"

# Ver o que está na gaveta
git stash list

# Recuperar o último stash
git stash pop             # aplica E remove da gaveta
git stash apply           # aplica mas MANTÉM na gaveta
git stash apply stash@{1} # aplica um específico

# Deletar um stash
git stash drop stash@{0}
git stash clear           # limpa tudo