Resolvendo um conflito de mesclagem 'ambos adicionados' no git?

138

Estou rebaseando no git, e um conflito que recebo é 'ambos adicionados' - ou seja, exatamente o mesmo nome de arquivo foi adicionado independentemente em minha ramificação e na ramificação em que estou rebaixando. git statusdiga-me:

# Unmerged paths:
#   (use "git reset HEAD <file>..." to unstage)
#   (use "git add/rm <file>..." as appropriate to mark resolution)
#
#       both added:         src/MyFile.cs

Minha pergunta é: como faço para resolver isso? Devo usar uma ferramenta de mesclagem ou existe uma maneira de fazê-lo apenas na linha de comando? Se eu git rm src/MyFile.cs, como o git sabe qual versão do arquivo eu quero remover e qual quero manter?

Jez
fonte

Respostas:

139

Se você usar git rmgit, todas as versões desse caminho serão removidas do índice, portanto, sua ação de resolução deixará você sem nenhuma das versões.

Você pode usar git checkout --ours src/MyFile.cspara escolher a versão da ramificação na qual você está refazendo ou git checkout --theirs src/MyFile.csescolher a versão na ramificação que está refazendo.

Se você deseja uma mistura, precisa usar uma ferramenta de mesclagem ou editá-la manualmente.

CB Bailey
fonte
1
Obrigado. E acabei de perceber que a razão pela qual a ferramenta de mesclagem não estava funcionando era porque o git cria os arquivos .LOCAL e .REMOTE para a mesclagem, mas não o arquivo .BASE. Eu acho que deveria apenas criar um arquivo .BASE vazio. Se você criar manualmente o arquivo .BASE vazio, a ferramenta de mesclagem funcionará bem.
Jez
1
@Jez: Por favor, veja este tópico: thread.gmane.org/gmane.comp.version-control.git/188776/…
CB Bailey
1
Então você está dizendo que isso será corrigido em uma versão recente do git?
Jez
1
@Jez: Está nas versões git> = 1.7.9.1 git.kernel.org/?p=git/…
CB Bailey
21
Das respostas da @Tom: Ao fazer ... git checkout --ours someFile Pode parecer que não fez nada ao fazer o status git. Lembre-se de fazer isso depois. git add someFile git status
pec
72

Às vezes, acho confuso usar as opções --theirse --ourspara identificar de onde o arquivo virá. Na maioria das vezes, o meu estará no ramo que estou refazendo ao qual é referido --theirs!

Você também pode usar git checkout <tree-ish> -- src/MyFile.cs

Onde <tree-ish>pode ser substituído pelo nome da filial ou pelo commit-id que contém o arquivo que você deseja manter.

git checkout 6a363d8 -- src/MyFile.cs

git checkout my_branch -- src/MyFile.cs

git checkout HEAD -- src/MyFile.cs

Anas Alkhatib
fonte
42

Ao fazer ...

git checkout --ours someFile

Pode parecer que não fez nada ao fazer o status git.

Lembre-se de fazer isso depois.

git add someFile
git status
Tom
fonte