Pregunta ¿Hay una versión de "ellos" de "git merge -s ours"?


Al fusionar la rama temática "B" en "A" usando git merge, Tengo algunos conflictos. Sé que todos los conflictos se pueden resolver usando la versión en "B".

Estoy consciente de git merge -s ours. Pero lo que quiero es algo así como git merge -s theirs.

¿Por qué no existe? ¿Cómo puedo lograr el mismo resultado después de la fusión conflictiva con la existente? git comandos? (git checkout cada archivo no compartido de B)

ACTUALIZACIÓN: La "solución" de simplemente descartar algo de la rama A (el punto de confirmación de fusión a la versión B del árbol) no es lo que estoy buscando.


666
2017-10-06 11:16


origen


Respuestas:


Añade el -X opción de theirs. Por ejemplo:

git checkout branchA
git merge -X theirs branchB

Todo se fusionará de la manera deseada.

Lo único que he visto causar problemas es si los archivos se eliminaron de branchB. Aparecen como conflictos si algo más que git eliminó.

La solución es fácil. Solo corre git rm con el nombre de los archivos que se eliminaron:

git rm {DELETED-FILE-NAME}

Después de eso, el -X theirs debería funcionar como se espera

Por supuesto, haciendo la eliminación real con el git rm comando evitará que el conflicto suceda en primer lugar.


Nota: También existe una opción de forma más larga. Para usarlo, reemplace:

-X theirs

con:

--strategy-option=theirs

777
2017-07-29 15:58



Una solución posible y probada para fusionar branchB en nuestra branchA desprotegidaA:

# in case branchA is not our current branch
git checkout branchA

# make merge commit but without conflicts!!
# the contents of 'ours' will be discarded later
git merge -s ours branchB    

# make temporary branch to merged commit
git branch branchTEMP         

# get contents of working tree and index to the one of branchB
git reset --hard branchB

# reset to our merged commit but 
# keep contents of working tree and index
git reset --soft branchTEMP

# change the contents of the merged commit
# with the contents of branchB
git commit --amend

# get rid off our temporary branch
git branch -D branchTEMP

# verify that the merge commit contains only contents of branchB
git diff HEAD branchB

Para automatizarlo, puede envolverlo en un script usando branchA y branchB como argumentos.

Esta solución conserva el primero y el segundo padre de la confirmación de fusión, tal como cabría esperar de git merge -s theirs branchB.


180
2018-02-11 13:42



Las versiones anteriores de git le permitieron usar la estrategia de fusión "suya":


git pull --strategy=theirs remote_branch

Pero esto ya se eliminó, como se explica en este mensaje por Junio ​​Hamano (el mantenedor de Git). Como se señaló en el enlace, en su lugar, haría esto:


git fetch origin
git reset --hard origin

Tenga cuidado, sin embargo, de que esto es diferente de una fusión real. Su solución es probablemente la opción que realmente está buscando.


79
2017-10-06 13:28



Utilicé la respuesta de Paul Pladijs desde ahora. Me enteré, puedes hacer una combinación "normal", los conflictos ocurren, entonces lo haces

git checkout --theirs <file>

para resolver el conflicto usando la revisión de la otra rama. Si haces esto para cada archivo, tienes el mismo comportamiento que esperarías de

git merge <branch> -s theirs

De todos modos, ¡el esfuerzo es más de lo que sería con la estrategia de fusión! (Esto fue probado con la versión de Git 1.8.0)


53
2017-11-03 12:51



No está del todo claro cuál es el resultado deseado, por lo que existe cierta confusión sobre la forma "correcta" de hacerlo en las respuestas y sus comentarios. Intento dar una visión general y ver las siguientes tres opciones:

Pruebe fusionar y use B para conflictos

Esto es no la "versión de ellos para git merge -s ours"pero la" versión de ellos para git merge -X ours"(que es la abreviatura de git merge -s recursive -X ours)

git checkout branchA
# also uses -s recursive implicitly
git merge -X theirs branchB

Esto es lo que p. La respuesta de Alan W. Smith hace.

Usar contenido solo de B

Esto crea una confirmación de fusión para ambas ramas, pero descarta todos los cambios de branchA y solo guarda los contenidos de branchB.

# Get the content you want to keep.
# If you want to keep branchB at the current commit, you can add --detached,
# else it will be advanced to the merge commit in the next step.
git checkout branchB

# Do the merge an keep current (our) content from branchB we just checked out.
git merge -s ours branchA

# Set branchA to current commit and check it out.
git checkout -B branchA

Tenga en cuenta que la fusión se compromete primer padre ahora es que desde branchBy solo el segundo es de branchA. Esto es lo que p. La respuesta de Gandalf458 hace.

Use solo el contenido de B y mantenga el orden correcto de los padres

Esta es la verdadera "versión suya" git merge -s ours". Tiene el mismo contenido que en la opción anterior (es decir, solo eso de branchB) pero el orden de los padres es correcto, es decir, el primer padre proviene de branchA y el segundo de branchB.

git checkout branchA

# Do a merge commit. The content of this commit does not matter,
# so use a strategy that never fails.
# Note: This advances branchA.
git merge -s ours branchB

# Change working tree and index to desired content.
# --detach ensures branchB will not move when doing the reset in the next step.
git checkout --detach branchB

# Move HEAD to branchA without changing contents of working tree and index.
git reset --soft branchA

# 'attach' HEAD to branchA.
# This ensures branchA will move when doing 'commit --amend'.
git checkout branchA

# Change content of merge commit to current index (i.e. content of branchB).
git commit --amend -C HEAD

Esto es lo que La respuesta de Paul Pladijs lo hace (sin requerir una sucursal temporal).


45
2017-12-07 00:04



Resolví mi problema usando

git checkout -m old
git checkout -b new B
git merge -s ours old

21
2017-10-06 11:34



Si está en la rama A, haga lo siguiente:

git merge -s recursive -X theirs B

Probado en la versión de Git 1.7.8


14
2018-04-12 19:17



Al fusionar la rama de tema "B" en "A" usando git merge, me salen algunos conflictos. Sé que todos los conflictos se pueden resolver usando la versión en "B".

Estoy al tanto de la fusión git -s la nuestra. Pero lo que quiero es algo así como git merge> -s their.

Supongo que creó una rama de master y ahora quiere fusionar de nuevo en master, anulando cualquier cosa antigua en master. Eso es exactamente lo que quería hacer cuando me encontré con esta publicación.

Haz exactamente lo que quieras hacer, excepto fusionar una rama en la otra primero. Acabo de hacer esto, y funcionó muy bien.

git checkout Branch
git merge master -s ours

Luego, finalice la compra maestra y combine su bifurcación (se ejecutará sin problemas ahora):

git checkout master
git merge Branch

8
2017-09-08 09:40



Para realmente hacer correctamente una fusión que toma solamente entrada de la sucursal que está fusionando puede hacer

git merge --strategy=ours ref-to-be-merged

git diff --binary ref-to-be-merged | git apply --reverse --index

git commit --amend

No habrá conflictos en ningún escenario que conozca, no tienes que crear ramas adicionales y actúa como una fusión normal.

Sin embargo, esto no funciona bien con los submódulos.


6
2017-10-30 14:47