Um guia passo a passo para resolver conflitos de merge ou rebase com segurança. Execute as etapas na ordem -- pular etapas é o que leva à perda de árvores de trabalho limpas. Cada etapa tem uma saída de emergência (--abort) para que você possa desistir a qualquer momento até o commit final.
Se algo estiver preparado (staged) ou modificado, comite, armazene (stash) ou descarte. Nunca inicie um merge com uma árvore suja -- os conflitos misturarão seu trabalho em andamento com a resolução do merge e você não conseguirá distingui-los.
# Stash if you want to keep work-in-progressgit stash push -u -m "wip before merging main"
Você faz o merge DENTRO do branch atual. Se você está prestes a executar git merge main, você deve estar no seu branch de funcionalidade -- não no main em si.
Um conflito resolvido contra um main desatualizado é trabalho perdido -- os conflitos reais ainda estão à sua frente. --ff-only recusa-se a fazer merge silenciosamente se seu branch divergiu.
git rev-parse HEAD# write this SHA somewhere -- a sticky note, a scratch file, anywhere
Se tudo der errado, git reset --hard <esse-sha> o colocará de volta exatamente onde você começou. git reflog também funciona, mas um SHA anotado é mais rápido sob estresse.
O Git imprime exatamente quais arquivos entram em conflito e que tipo de conflito cada um é (conteúdo vs. adição/adição vs. exclusão/modificação). Leia esta lista. Não comece a abrir arquivos até saber quantos conflitos você tem e onde eles estão.
git status# Look for "Unmerged paths" -- that is your work list
# Get a clean list of just the conflict filesgit diff --name-only --diff-filter=U
<<<<<<< HEAD
sua versão (o branch para o qual você está fazendo merge)
=======
a versão deles (o branch do qual você está fazendo merge)
>>>>>>> main
Durante um rebase, os rótulos são invertidos: HEAD é o branch base no qual você está fazendo rebase, e o lado >>>>>>> é o seu commit de entrada. Isso pega todos de surpresa pelo menos uma vez.
# Show the full diff with both sidesgit diff# Or for one specific filegit diff -- path/to/file.ts# See who wrote each side and whygit log --merge --oneline -- path/to/file.tsgit log -p HEAD..MERGE_HEAD -- path/to/file.ts
Saber por que cada lado fez uma alteração -- não apenas o que mudou -- é a diferença entre uma resolução real e um palpite que compila.
Para um rebase, git add NÃO avança automaticamente -- você ainda precisa da etapa 16. Para um merge, preparar todos os conflitos o deixa pronto para commitar.
Repita as etapas 8-13 para cada arquivo em git status.
# For a merge: what will the merge commit contain?git diff HEAD# For a rebase: how does my branch differ from before?git range-diff <starting-sha>..ORIG_HEAD <starting-sha>..HEAD
Se o diff tiver arquivos que você não tocou ou esperava, algo deu errado. Pare e investigue antes de commitar.
# Merge: commit the merge with the auto-generated message (or write your own)git commit# Rebase: should already be done after the final --continue
Para um commit de merge, escreva um corpo que explique quais foram os conflitos e como você os resolveu. O seu "eu" futuro agradecerá durante um bisect.
# Merge: regular push is finegit push# Rebase: force-push, but ONLY to your own branches and ONLY with --force-with-leasegit push --force-with-lease
--force-with-lease recusa o push se outra pessoa comitou no branch remoto desde a última vez que você fez fetch -- é a diferença entre reescrever seu próprio histórico e sobrescrever o commit de um colega. Nunca use --force (sem -with-lease) em um branch compartilhado.
Resolver conflitos em uma base desatualizada. Sempre faça pull do main primeiro (etapa 3). Resolver contra o main da semana passada significa fazer o trabalho duas vezes.
Misturar seu trabalho em andamento na resolução. Uma árvore suja no início de um merge é um bug garantido. Armazene (stash) primeiro (etapa 1).
Confundir "ours" e "theirs" durante um rebase. Eles se invertem. Na dúvida, olhe git log para confirmar qual commit é qual.
Committar com marcadores ainda no arquivo. Sempre use grep para <<<<<<< antes de preparar.
Fazer force-push de um branch compartilhado. Use --force-with-lease, e nunca no main.
Revisado por Chris St. John·Última atualização: 7 de jul. de 2026