Como corrigir um conflito de mesclagem devido à remoção de um arquivo em uma ramificação?


208

Eu criei uma dialogramificação e quando tento mesclá-la à masterramificação. Existem 2 conflitos. Eu não sei como resolver CONFLICT (delete/modify). Você pode me dizer o que fazer?

$ git checkout master
$ git merge dialog
CONFLICT (delete/modify): res/layout/dialog_item.xml deleted in dialog and modified in HEAD. Version HEAD of res/layout/dialog_item.xml left in tree.
Auto-merging src/com/DialogAdapter.java
CONFLICT (content): Merge conflict in src/DialogAdapter.java
Automatic merge failed; fix conflicts and then commit the result.

Eu abri src/DialogAdapter.java, resolvi o conflito e fiz a git add src/DialogAdapter.java. O que mais eu preciso fazer?


Você pode ler esta postagem no Stack Overflow: - Como faço para corrigir conflitos de mesclagem no Git? A resposta aceita faz referência ao manual do git .
heavyd 4/09/09

Respostas:


271

A mensagem de conflito:

CONFLITO (excluir / modificar): res / layout / dialog_item.xml excluído na caixa de diálogo e modificado no HEAD

significa que res/layout/dialog_item.xmlfoi excluído no ramo de 'diálogo' em que você está mesclando, mas foi modificado em HEAD (no ramo em que você está mesclando).

Então você tem que decidir se

  • remover arquivo usando " git rm res/layout/dialog_item.xml"

ou

  • aceite a versão do HEAD (talvez depois de editá-la) com " git add res/layout/dialog_item.xml"

Então você finaliza a mesclagem com " git commit".

Observe que o git avisará que você está criando um commit de mesclagem, no caso (raro) em que é algo que você não deseja. Provavelmente permanece desde os dias em que o caso foi menos raro.


22
Tentei o primeiro ( git rm …), mas eu recebo …: needs mergee rm '…'que estou tendo dificuldade em interpretar. E se eu tentar confirmar, o stackoverflow.com/questions/19985906/… será exibido novamente.
Jesse Glick

17
Não importa a segunda metade desse comentário. A saída do Git é um pouco alarmante, mas parece inofensiva.
precisa

4
Existe uma abordagem em massa? Eu tenho um projeto em mãos que depende de coisas externas que eu não quero manter. Portanto, existem muitos arquivos que foram modificados upstream e eu quero excluir no meu ramo que estou revidando, não importa o quê. É entediante fazê-lo um por um.
mlt

2
@mit: você pode usar git ls-files --stagee / ou / git status --porcelaine / git diff-files <something>para obter a lista de arquivos alterados e dirigir um script para excluí-los ou aceitar sua versão.
Jakub Narębski

1
@Mel: A mensagem CONFLICT inclui descrição sobre qual alteração ocorreu em qual filial. Você pode verificá-lo mais tarde com git statusou git diff --cc. Há também git log --mergeo que pode ajudar ...
Jakub Narębski

74

Eu normalmente corro git mergetool e ele me perguntará se quero manter o arquivo modificado ou excluído. Esta é a maneira mais rápida de IMHO, pois é um comando em vez de vários por arquivo.

Se você possui vários arquivos excluídos em um subdiretório específico e deseja que todos eles sejam resolvidos com a exclusão dos arquivos, faça o seguinte:

yes d | git mergetool -- the/subdirectory

O dé fornecido para escolher excluir cada arquivo. Você também pode usar mpara manter o arquivo modificado. Retirado do prompt que você vê quando executa mergetool:

Use (m)odified or (d)eleted file, or (a)bort?

1
@BrianMinton mim também, as outras coisas era apenas um círculo vicioso
Nate L

2
Isso fica chato quando há muitos arquivos, existe uma maneira de dar uma resposta para todos?
precisa saber é o seguinte

2
@ ideasman42 Atualizei minha resposta para mostrar uma solução de exclusão em lote.
void.pointer

1
Eu realmente não sabia sobre a ferramenta de mesclagem. Você salvou meu dia, cara!
Mert

6

Se você estiver usando o Git Gui no Windows,

  1. Abortar a mesclagem
  2. Verifique se você está no ramo de destino
  3. Exclua o arquivo conflitante do explorer
  4. Verificar novamente as alterações no Git Gui (F5)
  5. Observe que o arquivo conflitante foi excluído
  6. Selecione Arquivos alterados no estágio a serem confirmados (Ctrl-I) no menu Confirmar
  7. Digite um comentário de confirmação como "arquivo conflitante excluído"
  8. Confirmar (ctrl-enter)
  9. Agora, se você reiniciar a mesclagem, esperamos que funcione.

5
O cara simplesmente não gosta da maneira como você lida com o Git com a GUI, provavelmente. Uma maneira de linha de comando é melhor.
Souris
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.