¿Resolver un conflicto de fusión 'ambos agregados' en git?

138

Estoy rebasando en git, y un conflicto que obtengo es 'ambos agregados', es decir, exactamente el mismo nombre de archivo se ha agregado independientemente en mi rama y en la rama en la que rebase. git statusme dice:

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

Mi pregunta es, ¿cómo resuelvo esto? ¿Debo usar una herramienta de combinación o hay alguna manera de hacerlo desde la línea de comandos? En caso afirmativo git rm src/MyFile.cs, ¿cómo sabe git qué versión de archivo quiero eliminar y cuál quiero conservar?

Jez
fuente

Respuestas:

139

Si usa git rmgit eliminará todas las versiones de esa ruta del índice, por lo que su acción de resolución lo dejará sin ninguna de las versiones.

Puede usar la git checkout --ours src/MyFile.csopción para elegir la versión de la rama en la que está volviendo git checkout --theirs src/MyFile.csa crear un rebase o para elegir la versión de la rama en la que está haciendo un rebase.

Si desea una combinación, debe usar una herramienta de combinación o editarla manualmente.

CB Bailey
fuente
1
Gracias. Y me di cuenta de que la razón por la que la herramienta de fusión no funcionaba era porque git crea los archivos .LOCAL y .REMOTE para la fusión, pero no el archivo .BASE. Creo que debería crear un archivo .BASE vacío. Si crea manualmente el archivo .BASE vacío, la herramienta de combinación funciona bien.
Jez
1
Entonces, ¿estás diciendo que esto se solucionará en una versión reciente de git?
Jez
1
@Jez: está en versiones git> = 1.7.9.1 git.kernel.org/?p=git/…
CB Bailey
21
De @Tom responde: Al hacer ... git checkout --ours someFile Puede parecer que no hizo nada al hacer el estado de git. Solo recuerda hacer esto después. git add someFile git status
pec
72

A veces me resulta confuso usar las opciones --theirsy --ourspara identificar de dónde vendrá el archivo. ¡La mayoría de las veces la mía estará en la rama que estoy rebajando, a la que se refiere --theirs!

También puedes usar git checkout <tree-ish> -- src/MyFile.cs

Donde el <tree-ish> se puede reemplazar por el nombre de la sucursal o el commit-id que contiene el archivo que desea conservar.

git checkout 6a363d8 -- src/MyFile.cs

git checkout my_branch -- src/MyFile.cs

git checkout HEAD -- src/MyFile.cs

Anas Alkhatib
fuente
42

Al hacer ...

git checkout --ours someFile

Puede parecer que no hizo nada al hacer el estado de git.

Solo recuerda hacer esto después.

git add someFile
git status
Tom
fuente