git - conflito de mesclagem quando o local é excluído, mas o arquivo existe no remoto

116

Eu sou muito novo no git e gostaria de saber como eu deveria fazer uma fusão onde no repositório local eu apaguei vários arquivos no branch master, mas esses arquivos existem dentro do branch master remoto.

Depois de fazer git-merge, ele mostra os conflitos que ocorreram.

Usando git gui, ele mostra que o arquivo local foi excluído, enquanto o arquivo do branch remoto tem conteúdo.

Como você evita que esses arquivos entrem em conflito? Existe uma maneira simples de usar git gui?

Muito Obrigado

criações binárias
fonte
No passado, uma coisa que fiz foi deixar os arquivos "excluídos" no controle de origem, mas excluí-los do projeto / makefile / qualquer coisa. É uma boa solução temporária para os conflitos de mesclagem, pelo menos.
Mark Rushakoff
2
Você corrige da mesma forma que corrige qualquer conflito de mesclagem: adicione a versão desejada (o arquivo ou a falta do arquivo) ao índice e, em seguida, efetue o commit. Qual deles você quer?
Cascabel
@MarkRushakoff Eu reformularia seu conselho para "quando me deparo com uma situação em que preciso resolver o conflito, simplesmente não os resolvo de verdade, apenas os mascare para que mordam alguém (provavelmente não eu) no futuro". Este é um conselho realmente bom para alguém que gostaria de trazer mais problemas para o projeto.
Victor Yarema

Respostas:

155

Você deve resolver os conflitos como achar adequado. Se o arquivo realmente deve ser removido e você vai publicar essa alteração na origem, remova-o novamente:

git rm path/to/file

Se o arquivo ainda deve ser rastreado, adicione-o (a versão na árvore de trabalho será a versão de origem):

git add path/to/file

Depois de fazer qualquer um desses procedimentos para resolver o conflito, comprometa a fusão.

Cascabel
fonte
Eu tinha vários arquivos, todos no mesmo diretório e todos com o mesmo sufixo. Existe um atalho para removê-los todos de uma vez, preservando o resto dos arquivos no diretório?
chiborg,
@chiborg: Essa é apenas uma pergunta secreta. cdpara o diretório e git rm *.ext. Seu shell (não Git) se expande *.extpara todos os nomes de arquivos correspondentes.
Cascabel
E se eu quiser preservar alguns dos arquivos? git rmnão tem -ibandeira.
chiborg,
@chiborg: Você disse que queria remover tudo com um determinado sufixo e deixar todo o resto intacto. Isso é exatamente o que eu disse a você como fazer. Ou você quis dizer git rm *-suffix.ext? Mesma diferença. Se você estiver tendo problemas para descobrir como usar curingas do shell, pergunte em unix.stackexchange.com. Se você sabe com certeza que o que deseja não pode ser feito com globbing, use rm -ie siga git add -upara selecionar as exclusões.
Cascabel
2
@Jefromi, se estou especificando -s recursive -X ours, por que ainda é necessário git rme git add?
Noel Yap
27

Como dica adicional, além da resposta aceita, em um "excluído por nós" , se você gostaria de ver as alterações que foram feitas no arquivo excluído para que você possa aplicar essas alterações em outro lugar que você pode usar:

git diff ...origin/master -- path/to/file

Se for um cenário "excluído por eles" e você gostaria de ver as alterações para poder aplicá-las em outro lugar, você pode usar:

git diff origin/master... -- path/to/file
Joseph Ravenwolfe
fonte
6
sim! Isso é crucial se você não deseja simplesmente ignorar as alterações que está mesclando, como quando um arquivo acabou de ser renomeado ou seu conteúdo foi movido antes de o arquivo ser excluído.
Edward Anderson
8
Como um lembrete: Isso não funciona quando o conflito acontece durante o rebase . Precisa ser explícito comogit diff mybranch@{1}...origin/master -- path/to/file
nschum
@nschum Obrigado! Isso é exatamente o que eu estava procurando.
Chuim
2
Você também pode usar git diff --base(veja minha outra resposta).
Dorian Marchal
Olá, Joseph. Ainda estou preso, embora essa resposta pareça promissora. Se você tiver um momento, adoraria que você respondesse aqui: stackoverflow.com/q/63044843/470749 Obrigado!
Ryan
9

Na GUI do Git, você seleciona o arquivo em conflito e clica com o botão direito do mouse na área de texto principal onde o texto em conflito é mostrado.

No menu de contexto que aparece, você pode escolher ir com "Remoto" ou ir com "Local". Portanto, se um arquivo for excluído remotamente, você pode escolher "Remoto" para propagar a exclusão localmente e vice-versa.

Levei um mês para descobrir ... seria bom se a GUI do Git realmente tivesse documentação ...

Joel Freeman
fonte
4

A resposta mais bem avaliada se concentra na maneira de resolver o conflito.

Antes disso, você provavelmente deseja saber o que o controle remoto mudou nos arquivos removidos localmente.

Para fazer isso, você pode ver as mudanças com:

git diff --base

De https://git-scm.com/docs/git-diff#Documentation/git-diff.txt--1--base

Compare a árvore de trabalho com a versão "base" [...]. O índice contém esses estágios apenas para entradas não mescladas, ou seja, durante a resolução de conflitos.

Dorian Marchal
fonte
Aqui está uma boa explicação de git diff --base stackoverflow.com/a/60484874/470749
Ryan
0

No EGit também encontrei problemas. Minha solução foi:

  • Usou a visualização Git Staging.
  • Clique duas vezes em cada arquivo mostrado nas mudanças não planejadas para abrir o comparador
  • Clique no ícone "Copiar tudo da esquerda para a direita"
  • Salvar arquivo (ele irá desaparecer da lista não testada)
Borjab
fonte
0

Conforme declarado nesta resposta útil a uma pergunta relacionada , você pode usar git mergetoolpara iniciar um diálogo onde pode selecionar se deseja obter a versão modificada ou excluída do (s) arquivo (s).

Amos Egel
fonte