Como resolver conflitos de fusão em Git

Como posso resolver conflitos de fusão em Git?

Solução

Tente: git mergetool

Abre uma GUI que o conduz através de cada conflito, e você pode escolher como se fundir. Às vezes é necessário um pouco de edição manual depois, mas normalmente é suficiente por si só. É muito melhor do que fazer a coisa toda à mão, certamente.

Como por @JoshGlover comentário:

O comando não abre necessariamente uma GUI, a menos que você instale uma. Executando git mergetool para mim resultou na utilização do vimdiff. Você pode instalar uma das seguintes ferramentas para utilizá-lo em seu lugar: meld, opendiff, kdiff3, tkdiff, xxdiff, tortoisemerge, gvimdiff, diffuse, ecmerge, p4merge, araxis, vimdiff, emerge.

Abaixo está o procedimento de amostra para utilizar o vimdiff para resolver conflitos de fusão. Baseado em este link.

**Passo 1***: Execute os seguintes comandos no seu terminal

git config merge.tool vimdiff
git config merge.conflictstyle diff3
git config mergetool.prompt false

Isto irá definir o vimdiff como a ferramenta padrão de fusão.

**Passo 2***: Executar o seguinte comando no terminal

git mergetool

**Passo 3***: Você verá uma exibição vimdiff no seguinte formato

  ╔═══════╦══════╦════════╗
  ║       ║      ║        ║
  ║ LOCAL ║ BASE ║ REMOTE ║
  ║       ║      ║        ║
  ╠═══════╩══════╩════════╣
  ║                       ║
  ║        MERGED         ║
  ║                       ║
  ╚═══════════════════════╝

Estas 4 visões são

LOCAL - este é o ficheiro do ramo actual

BASE - ancestral comum, como era o arquivo antes das duas mudanças

REMOTE - arquivo que você está fundindo na sua filial

MERGED - resultado da fusão, isto é o que é salvo na repo

Você pode navegar entre estas vistas usando ctrl+w. Pode chegar directamente à vista MERGED usando ctrl+w seguido de j.

Mais informações sobre a navegação vimdiff aqui e aqui.

**Passo 4***. Você poderia editar a visão MERGED da seguinte maneira

Se você quiser obter alterações do REMOTE

:diffg RE  

Se você quiser obter mudanças da BASE

:diffg BA  

Se você quiser obter mudanças da LOCAL

:diffg LO 

**Passo 5***. Salvar, Sair, Comprometer e Limpar

:wqa salvar e sair da vi

git commit -m "mensagem"

Remover arquivos extras (por exemplo, *.origina) criados pela ferramenta diff.

Comentários (20)
  1. Identificar que ficheiros estão em conflito (Git deve dizer-lhe isto).

    1. Abra cada arquivo e examine as diferenças; Git as demarca. Esperemos que seja óbvio qual a versão de cada bloco a manter. Você pode precisar discuti-la com colegas desenvolvedores que tenham cometido o código.
  2. Uma vez resolvido o conflito em um arquivo git add the_file.

  3. Uma vez resolvidos todos os conflitos, faça git rebase --continue ou qualquer comando O Git disse para fazer quando terminasses.

Comentários (7)

Se você está fazendo pequenos commits frequentes, então comece por olhar os comentários de commit com git log --merge. Então o git diff irá mostrar-lhe os conflitos.

Para conflitos que envolvem mais do que algumas linhas, é mais fácil ver o que está acontecendo em uma ferramenta GUI externa. Eu gosto do opendiff -- Git também suporta vimdiff, gvimdiff, kdiff3, tkdiff, meld, xxdiff, emerge da caixa e você pode instalar outros: O git config merge.tool "sua.ferramenta" irá definir sua ferramenta escolhida e então o `git mergetool' após uma mergetool falhada irá lhe mostrar os diffs no contexto.

Cada vez que você editar um arquivo para resolver um conflito, git add fileename irá atualizar o índice e sua diff não mais o mostrará. Quando todos os conflitos forem resolvidos e seus arquivos tiverem sido git add-ed, git commit completará sua fusão.

Comentários (1)