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?

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.


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
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


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
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.