LogoLogo
  • Git e GitHub para Humanos
  • Sumário
  • 1. Antes de Começar
    • 1.1 Este livro é para você?
    • 1.2 A razão por trás deste livro
    • 1.3 Visão geral
    • 1.4 Sobre o GitHub
    • 1.5 Sobre a Cumbuca Dev
    • 1.6 O maravilhoso mundo do open source
    • 1.7 Mapa do livro
    • 1.8 Glossário: capítulo 1
  • 2. Fundamentos de Controle de Versão e Git
    • 2.1 Introdução a sistemas de controle de versão
      • 2.1.1 Sistemas de controle de versão centralizados
      • 2.1.2 Sistemas de controle de versão distribuídos
    • 2.2 Introdução ao Git
    • 2.3 Conceitos Fundamentais do Git
      • 2.3.1 Repositório
      • 2.3.2 Commit
      • 2.3.3 Branch
      • 2.3.4 Merge
    • 2.4 Instalando o Git
      • 2.4.1 Instalando no Linux
      • 2.4.2 Instalando no macOS
      • 2.4.3 Instalando no Windows
    • 2.5 Interagindo com o Git
    • 2.6 O Comando Git
    • 2.7 Inicializando de um Repositório Local
    • 2.8 Configurando de um Repositório Local
    • 2.9 Links Úteis: Capítulo 2
    • 2.10 Glossário: Capítulo 2
  • 3. Operações Locais Básicas no Git
    • 3.1 Explorando Operações Locais do Git
    • 3.2 Salvando Alterações Localmente
      • 3.2.1 Adicionando Arquivos ao Controle de Versão via `git add`
      • 3.2.2 Verificando o Estado do Repositório via `git status`
      • 3.2.3 Criando Commits via `git commit`
      • 3.2.4 Visualizando o Histórico do Repositório via `git log`
      • 3.2.5 Comparando Alterações via `git diff`
      • 3.2.6 Unindo os Pontos
      • 3.2.7 Exemplo Prático
    • 3.3 Trabalhando com Branches Localmente
      • 3.3.1 Gerenciando Branches via `git branch`
      • 3.3.2 Alternando Entre Branches via `git switch`
      • 3.3.3 Mesclando Branches via `git merge`
        • 3.3.3.1 Resolvendo Conflitos de Merge
      • 3.3.4 Unindo os Pontos
      • 3.3.5 Exemplo Prático
    • 3.4 Links Úteis: Capítulo 3
    • 3.5 Glossário: Capítulo 3
  • 4. Ajuste de Mudanças Locais no Git
    • 4.1 Desfazendo Alterações Localmente
      • 4.1.1 Desfazendo Alterações Antes do Commit
      • 4.1.2 Desfazendo Commits
      • 4.1.3 Alterando o Último Commit via `git commit --amend`
      • 4.1.4 Unindo os Pontos
      • 4.1.5 Exemplos Práticos
    • 4.2 Ignorando e Removendo Arquivos do Rastreamento Local
      • 4.2.1 Ignorando Arquivos do Rastreamento Utilizando o arquivo .gitignore
      • 4.2.2 Removendo Arquivos do Rastreamento via `git rm`
    • 4.3 Links Úteis: Capítulo 4
    • 4.4 Glossário: Capítulo 4
  • 5. Introdução ao GitHub
    • 5.1 Qual a diferença entre Git e GitHub?
    • 5.2 Grandes Projetos Abertos no GitHub
    • 5.3 Recursos do GitHub
    • 5.4 Idioma Suportado no GitHub
    • 5.5 Contas no GitHub
      • 5.5.1 Conta Pessoal
      • 5.5.2 Conta de Organização
      • 5.5.3 Conta Corporativa
      • 5.5.4 Unindo os Pontos
    • 5.6 Planos do GitHub
    • 5.7 Criando uma Conta Pessoal no GitHub
    • 5.8 Explorando a Interface do GitHub
      • 5.8.1 Página Principal (Home)
      • 5.8.2 Página de Notificações (Notifications)
      • 5.8.3 Página de Configurações (Settings)
    • 5.9 Links Úteis: Capítulo 5
    • 5.10 Glossário: Capítulo 5
  • 6. Repositórios no GitHub
    • 6.1 O quê é um Repositório no GitHub?
    • 6.2 Criando um Repositório no GitHub
    • 6.3 Página Principal de um Repositório: Aba Code
      • 6.3.1 Editando um Arquivo em um Repositório no GitHub
      • 6.3.2 Explorando o Histórico de Commits de um Repositório no GitHub
      • 6.3.3 Editando Detalhes de um Repositório no GitHub
      • 6.3.4 Explorando um Repositório Ativo em Uso
    • 6.4 Página de Configurações de um Repositório: Aba Settings
      • 6.4.1 Gerenciando Configurações Gerais de um Repositório no GitHub: Menu General
      • 6.4.2 Gerenciando Configurações de Colaboração de um Repositório no GitHub: Menu Collaborators
      • 6.4.3 Explorando Configurações de um Repositório no GitHub na Prática
    • 6.5 Links Úteis: Capítulo 6
    • 6.6 Glossário: Capítulo 6
  • 7. Documentação de Projetos
    • 7.1 O quê é Documentação de Projeto?
    • 7.2 Explorando a Linguagem de Marcação Markdown
    • 7.3 Criando uma Página de Apresentação no GitHub
    • 7.4 Links Úteis: Capítulo 7
    • 7.5 Glossário: Capítulo 7
  • 8. Issues no GitHub
    • 8.1 O quê é GitHub Issues?
    • 8.2 Criando uma Issue no GitHub
    • 8.3 Explorando a Página de uma Issue no GitHub
    • 8.4 Atribuindo uma Issue no GitHub
    • 8.5 Categorizando Issues de um Repositório através de Labels no GitHub
      • 8.5.1 Gerenciando Labels de um Repositório no GitHub
    • 8.6 Página de Issues de um Repositório no GitHub: Aba Issues
    • 8.7 Explorando Issues no Mundo Real
    • 8.8 Links Úteis: Capítulo 8
    • 8.9 Glossário: Capítulo 8
  • 9. Git Remoto
    • 9.1 Explorando Operações Remotas do Git
    • 9.2 Interagindo com o Repositório Remoto Central no Git
      • 9.2.1 Clonando um Repositório Remoto via `git clone`
      • 9.2.2 Buscar Atualizações de um Repositório Remoto via `git fetch`
      • 9.2.3 Enviando Mudanças Locais para o Repositório Remoto via `git push`
      • 9.2.4 Sincronizando o Repositório Local com o Remoto via `git pull`
      • 9.2.5 Unindo os Pontos
      • 9.2.6 Exemplo
    • 9.3 Interagindo com o Repositório Remoto hello-world
      • 9.3.1 Conectando-se ao GitHub via SSH
      • 9.3.2 Clonando o Repositório hello-world
      • 9.3.3 Alterando hello-world Localmente
        • 9.3.3.1 Editor de Código
        • 9.3.3.2 Editando README.md
        • 9.3.3.3 Salvando Alterações no Controle de Versão Local
      • 9.3.4 Enviando Alterações para o Repositório Remoto
    • 9.4 Links Úteis: Capítulo 9
    • 9.5 Glossário: Capítulo 9
  • 10. Pull Requests no GitHub
    • 10.1 O quê é um Pull Requests no GitHub?
    • 10.2 Entendendo as Propriedades de um Pull Request no GitHub
      • 10.2.1 Branches de Origem e de Destino de um Pull Request
      • 10.2.2 Título de um Pull Request
      • 10.2.3 Descrição de um Pull Request
      • 10.2.4 Modificações de um Pull Request
      • 10.2.5 Pessoas Revisoras de um Pull Request
      • 10.2.6 Labels de um Pull Request
    • 10.3 Criando um Pull Request no GitHub
    • 10.4 Página de um Pull Request no GitHub
      • 10.4.1 Aba Conversation
      • 10.4.2 Aba Commits
      • 10.4.3 Aba Checks
      • 10.4.4 Aba Files Changed
    • 10.5 Página de Pull Requests de um Repositório no GitHub: Aba Pull Requests
    • 10.6 Recebendo Revisões em um Pull Request no GitHub
      • 10.6.1 Boas Práticas
      • 10.6.2 Exemplo Prático
        • 10.6.2.1 Adicionando Conta Colaboradora
        • 10.6.2.2 Solicitando Revisão de Pull Request
        • 10.6.2.3 Lidando com o Feedback
    • 10.7 Mesclando um Pull Request no GitHub
      • 10.7.1 Exemplo Prático
    • 10.8 Atualizando um Repositório Local Após Mesclagem
    • 10.9 Explorando Pull Requests no Mundo Real
    • 10.10 Links Úteis: Capítulo 10
    • 10.11 Glossário: Capítulo 10
  • 11. Fluxo de Trabalho
    • 11.1 Fork no GitHub
      • Fork
    • 11.2 Forks e Pull Requests
      • 11.2.1 Criando um Fork no GitHub
      • 11.2.2 Clonando um Fork
      • 11.2.3 Realizando Alterações Localmente
      • 11.2.4 Enviando Alterações Locais para o Fork Remoto
      • 11.2.5 Criando um Pull Request a partir de um Fork no GitHub
      • 11.2.6 Sincronizando um Fork no GitHub
      • 11.2.7 Revisão, Mesclagem e Atualizações Pós-mesclagem
    • 11.3 Fluxo de Trabalho
  • 11.4 Links Úteis - Capítulo 11
  • 11.5 Glossário - Capítulo 11
  • 12. O Caminho Continua
    • 12.1 Conhecendo Ferramentas Adicionais
      • 12.1.1 Indicação: Jogo Oh My Git
    • 12.2 Explorando Projetos Open Source
    • 12.3 Crescendo e Colaborando em Comunidades
    • 12.4 Desafio: GitCaos 🔥
    • 12.5 Links Úteis - Capítulo 12
    • 12.6 Glossário Completo: Git e GitHub para Humanos
Fornecido por GitBook
Nesta página
  • Conflito
  • Por que o Git não Consegue Resolver o Conflito Sozinho?
  • O Processo de Merge
  • O Git não Consegue Iniciar o Merge
  • Merge sem Conflito
  • Merge com Conflito
  • Cancelamento do Merge
  • Resolução dos Conflitos

Isto foi útil?

Editar no GitHub
Exportar como PDF
  1. 3. Operações Locais Básicas no Git
  2. 3.3 Trabalhando com Branches Localmente
  3. 3.3.3 Mesclando Branches via `git merge`

3.3.3.1 Resolvendo Conflitos de Merge

Conflito

Um conflito no Git ocorre quando ele não consegue mesclar automaticamente as alterações feitas em dois branches diferentes. Isso acontece quando ambos modificam a mesma parte do código e o Git não sabe qual alteração deve ser mantida.

Conflitos são comuns quando várias pessoas colaboram em um projeto. Por exemplo:

  • Duas pessoas editam as mesmas linhas de um arquivo.

  • Alguém exclui um arquivo enquanto outra pessoa faz alterações nele.

  • Arquivos são movidos ou renomeados em diferentes branches.

O Git precisa da sua intervenção para resolver essas situações e decidir qual versão do código será mantida.

Situações em que um conflito pode ocorrer:

  • Alterações no mesmo trecho do código: Quando o mesmo trecho de um arquivo é alterado em ambos os branches.

  • Alterações conflitantes: Quando um arquivo foi removido em um branch e modificado no outro.

  • Mudanças na estrutura de diretórios: Quando há conflitos na estrutura de diretórios, como arquivos movidos ou renomeados em ambos os branches.

Situações em que o Git consegue resolver sozinho:

  • Alterações em arquivos diferentes: Quando as mudanças são feitas em arquivos diferentes, o Git pode mesclar automaticamente.

  • Alterações em partes diferentes do mesmo arquivo: Quando as alterações acontecem em áreas separadas de um arquivo, o Git pode combinar automaticamente.

  • Arquivos adicionados em apenas um branch: Se um arquivo foi adicionado em um branch, mas não existe no outro, o Git pode integrá-lo automaticamente.

Por que o Git não Consegue Resolver o Conflito Sozinho?

O Git não pode decidir qual versão do código é a correta porque ele não entende a intenção e o contexto por trás das mudanças. Imagine um exemplo em que duas pessoas editaram a primeira linha de um mesmo arquivo:

  • Alice alterou um texto para "Boas vindas ao nosso sistema!"

  • Bob alterou o mesmo texto para "Olá! Esperamos que goste do nosso produto."

O Git não pode simplesmente escolher uma versão sem interferência humana, porque não sabe qual das mensagens é mais apropriada. Essa decisão precisa ser feita por uma pessoa, analisando o contexto.

O Processo de Merge

Quando você executa o comando git merge, o Git tenta combinar as alterações de dois branches. O processo de mesclagem pode resultar em três tipos de cenário:

  1. O Git não consegue iniciar o merge: Caso haja mudanças no diretório de trabalho ou na área de staging do projeto atual, o merge não é iniciado.

  2. O merge ocorre sem conflitos: O Git consegue combinar todas as mudanças automaticamente.

  3. O merge é interrompido por presença de conflito(s): O Git não consegue resolver automaticamente uma ou mais diferenças entre os branches e precisa da sua intervenção para resolver o conflito.

A seguir, vamos detalhar cada um desses casos.

O Git não Consegue Iniciar o Merge

A inicialização do merge pode falhar se existirem mudanças no diretório de trabalho ou na área de staging do projeto atual.

O Git não pode iniciar o merge, pois essas mudanças pendentes podem ser gravadas pelos commits que estão passando pelo processo de merge. Quando esse tipo de erro acontece, é por causa de conflitos com mudanças locais pendentes, não conflitos com outros desenvolvedores. A falha da inicialização do merge vai fazer com que a mensagem de erro a seguir seja exibida:

error: Entry '<...>' not uptodate. Cannot merge. (Changes in working directory)

Você precisará comitar ou descartar as suas mudanças locais para ter sucesso ao executar o merge novamente.

Merge sem Conflito

Este é o caso descrito na seção anterior. Quando não há conflito, o Git consegue realizar o merge automaticamente e já cria um commit para você. Esse commit de merge é criado automaticamente, sem a necessidade de intervenção manual. A mensagem exibida será algo assim:

git merge nova-feature
▶ Updating a1b2c3d..d4e5f6g
Fast-forward
 file1.txt |  2 +-
 file2.txt |  8 +++++---
 2 files changed, 5 insertions(+), 5 deletions(-)

Isso indica que o Git realizou um merge, onde as mudanças foram integradas sem conflitos. Ao inspecionar o log de commits, você conseguirá ver o novo commit realizado:

Ao verificar o histórico de commits, você verá o merge registrado.

git log --oneline
▶ d4e5f6g Merge branch 'nova-feature'
b2c3d4e Adiciona funcionalidade X
a1b2c3d Corrige bug na tela de login
z1x2c3v Versão anterior do projeto

Merge com Conflito

Quando um ou mais conflitos ocorrem durante o merge, o Git não pode decidir automaticamente qual versão do código deve ser mantida e marca o(s) conflito(s) para que você resolva manualmente.

O Git interrompe o processo de merge e solicita que você edite os arquivos conflitantes. Você verá uma mensagem como essa:

git merge nova-feature
▶ Auto-merging arquivo1.txt
CONFLICT (content): Merge conflict in arquivo1.txt
Auto-merging arquivo2.txt
CONFLICT (content): Merge conflict in arquivo2.txt
Automatic merge failed; fix conflicts and then commit the result.

Essa mensagem indica que o merge automático falhou pois ocorreram conflitos nos arquivos arquivo1.txt e arquivo2.txt.

Diante deste cenário, você possui duas opção de como prosseguir:

  1. Cancelamento do merge: Se você decidir que não deseja continuar o merge, é possível abortá-lo.

  2. Resolução dos conflitos: explicar

Cancelamento do Merge

Se você deseja cancelar o merge completamente e voltar ao estado anterior, use o comando:

git merge --abort

Esse comando desfaz todas as mudanças feitas durante o merge e retorna o repositório ao estado anterior à tentativa de mesclagem.

Resolução dos Conflitos

O outro cenário possível é quando você deseja seguir em frente com o merge e irá resolver os conflitos manualmente.

Ao executar git status você poderá consultar novamente quais os arquivos que possuem conflitos.

On branch main
You have unmerged paths.
  (fix conflicts and run "git commit")

Unmerged paths:
  (use "git add <file>..." to mark resolution)
	both modified:   arquivo1.txt
	both modified:   arquivo2.txt

Após identificar os arquivos com conflitos, você deve abri-los no seu editor de texto. O Git terá adicionado marcadores especiais para apontar as partes conflitantes do código, desta forma:

<<<<<<< HEAD
Código do branch atual.
=======
Código do branch que você está mesclando.
>>>>>>> nome-do-branch
  • O trecho entre <<<<<<< HEAD e ======= representa o código do seu branch atual.

  • O trecho entre ======= e >>>>>>> nome-do-branch mostra o código do branch que você está tentando mesclar.

Você precisa editar cada arquivo manualmente para escolher qual parte do código manter ou, se necessário, combinar as duas versões.

Após editar o arquivo, remova os marcadores (<<<<<<<, =======, >>>>>>>) e salve as mudanças.

Ao resolver o conflito, use o comando git add para informar ao Git que o conflito foi resolvido em cada um dos arquivos:

git add arquivo1.txt arquivo2.txt

Ao resolver todos os conflitos, você pode finalizar a mesclagem realizando o commit de merge:

git commit -m "Merge branch 'nova-feature'"

Este commit irá incluir todas as mudanças do merge—tanto as resolvidas manualmente quanto as mescladas automaticamente.

Esta é uma explicação simplificada para fins didáticos. Para explorar todas as possibilidades em como lidar com conflitos durante o comando gitmerge, consulte a documentação oficial.

Anterior3.3.3 Mesclando Branches via `git merge`Próximo3.3.4 Unindo os Pontos

Atualizado há 3 meses

Isto foi útil?