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?

BuZZ-dEE
fonte
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.

Jakub Narębski
fonte
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?
void.pointer
fonte
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.
salihcenap
fonte
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