Como posso resolver conflitos de fusão em Git?
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.
Identificar que ficheiros estão em conflito (Git deve dizer-lhe isto).
Uma vez resolvido o conflito em um arquivo git add the_file
.
Uma vez resolvidos todos os conflitos, faça git rebase --continue
ou qualquer comando
O Git disse para fazer quando terminasses.
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.