Al fusionar la rama de tema "B" en "A" usando git merge
, obtengo algunos conflictos. Sé que todos los conflictos se pueden resolver utilizando la versión en "B".
Soy consciente de git merge -s ours
. Pero lo que quiero es algo comogit merge -s theirs
.
¿Por qué no existe? ¿Cómo puedo lograr el mismo resultado después de la fusión conflictiva con los git
comandos existentes ? (git checkout
cada archivo no combinado de B)
ACTUALIZACIÓN: La "solución" de simplemente descartar cualquier cosa 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.
git merge -s their
.git merge -s theirs
(que se puede lograr fácilmente congit merge -s ours
una rama temporal), ya que la nuestra ignora por completo los cambios de la rama de fusión ...theirs
, además deours
??? Este es un síntoma de uno de los problemas de ingeniería y diseño de alto nivel en Git: inconsistencia.Respuestas:
Agregue la
-X
opción atheirs
. Por ejemplo:Todo se fusionará de la manera deseada.
Lo único que he visto causar problemas es si los archivos se eliminaron de la rama B. Aparecen como conflictos si algo más que git hizo la eliminación.
La solución es fácil. Simplemente ejecute
git rm
con el nombre de los archivos que se eliminaron:Después de eso, el
-X theirs
debería funcionar como se esperaba.Por supuesto, hacer la eliminación real con el
git rm
comando evitará que el conflicto ocurra en primer lugar.Nota : También existe una opción de formulario más largo.
Para usarlo, reemplace:
con:
fuente
theirs
". -Xtheirs es la opción de estrategia aplicada a la estrategia recursiva . Esto significa que la estrategia recursiva aún fusionará todo lo que pueda, y solo recurrirá a la lógica "suya" en caso de conflicto. Si bien esto es lo que uno necesita en la mayoría de los casos como el anterior, no es lo mismo que "simplemente tome todo de la rama B tal como está". Realmente se fusiona de todos modos.Una solución posible y probada para fusionar la rama B en nuestra rama extraída A:
Para automatizarlo, puede envolverlo en un script usando branchA y branchB como argumentos.
Esta solución conserva el primer y segundo padre de la confirmación de fusión, tal como cabría esperar
git merge -s theirs branchB
.fuente
git reset --soft branchA
?git reset --hard
cambios que commitbranchA
apunta a.Las versiones anteriores de git le permitían usar la estrategia de fusión "de ellos":
Pero esto se ha eliminado desde entonces, como lo explica Junio Hamano (el responsable de mantenimiento de Git) en este mensaje . Como se señaló en el enlace, en su lugar haría esto:
Sin embargo, tenga en cuenta que esto es diferente a una fusión real. Su solución es probablemente la opción que realmente está buscando.
fuente
git reset --hard origin
una solución para unir su estilo? Si quisiera fusionar BranchB en BranchA (como en la respuesta de Alan W. Smith), ¿cómo lo haría usando elreset
método?git reset --hard
es una fusión de estilo "suyo". Por supuesto,git reset --hard
no crea ninguna confirmación de fusión, ni ninguna confirmación para el caso. Su punto es que no deberíamos usar una combinación para reemplazar lo que sea en HEAD por otra cosa. Sin embargo, no estoy necesariamente de acuerdo.theirs
se haya eliminado porque la lógica era incompleta. No permitió esas instancias donde el código es bueno, es solo que el flujo ascendente se mantiene sobre una base filosófica diferente, por lo que en ese sentido es 'malo', por lo que uno quiere mantenerse actualizado con el flujo ascendente, pero al mismo tiempo, conserve los buenos 'arreglos' de código [git y msysgit tienen esto en parte de este 'conflicto' debido a las filosofías de sus diferentes plataformas de destino]theirs
porque había cambiado accidentalmente algunos archivos en dos ramas separadas y quería descartar los cambios de uno sin tener que hacerlo manualmente para cada archivo.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:
Intente fusionar y usar B para conflictos
Esta no es la "versión de ellos para
git merge -s ours
" sino la "versión de ellos paragit merge -X ours
" (que es la abreviatura degit merge -s recursive -X ours
):Esto es lo que hace, por ejemplo, la respuesta de Alan W. Smith .
Use contenido de B solamente
Esto crea una confirmación de fusión para ambas ramas, pero descarta todos los cambios
branchA
y solo mantiene el contenidobranchB
.Tenga en cuenta que la fusión confirma que el primer padre ahora es de
branchB
y solo el segundo es debranchA
. Esto es lo que hace, por ejemplo, la respuesta de Gandalf458 .Use contenido de B solamente y mantenga el orden principal correcto
Esta es la verdadera "versión para ellos
git merge -s ours
". Tiene el mismo contenido que en la opción anterior (es decir, solo el debranchB
), pero el orden de los padres es correcto, es decir, el primer padre provienebranchA
y el segundo debranchB
.Esto es lo que hace la respuesta de Paul Pladijs (sin requerir una rama temporal).
fuente
git checkout branchA; git merge -s ours --no-commit branchB; git read-tree -um @ branchB; git commit
read-tree
que el usuario promedio de git podría no estar acostumbrado (al menos no lo estoy ;-)). Las soluciones en la respuesta usan solo los comandos de alto nivel ("porcelana") que la mayoría de los usuarios de git deberían conocer. ¡Los prefiero pero gracias por tu versión, sin embargo!…commit --amend…
) se "perderá". Estoy planeando agregar algunas explicaciones gráficas a esta respuesta tan pronto como tenga tiempo de hacerlo ... ;-)Usé la respuesta de Paul Pladijs desde ahora. Descubrí que puedes hacer una fusión "normal", se producen conflictos, así que
para resolver el conflicto utilizando la revisión de la otra rama. Si hace esto para cada archivo, tiene el mismo comportamiento que esperaría de
De todos modos, ¡el esfuerzo es más de lo que sería con la estrategia de fusión! (Esto fue probado con git versión 1.8.0)
fuente
git ls-files --modified | xargs git add
quería hacer esto para agregar en ambos lados fusionar: /git ls-files --modified
así que supongo que esta también es una solución viable.git config --global alias.unresolved '!git status --short|egrep "^([DAU])\1"'
-X
y cuál es la diferencia entre-X
y-s
? No puedo encontrar ningún documento.Resolví mi problema usando
fuente
Supongo que creó una rama de master y ahora desea volver a fusionarse en master, anulando cualquiera de las cosas antiguas en master. Eso es exactamente lo que quería hacer cuando me encontré con esta publicación.
Haz exactamente lo que quieres hacer, excepto combinar primero una rama con la otra. Acabo de hacer esto, y funcionó muy bien.
Luego, finalice el proceso de pago y combine su rama en él (ahora se realizará sin problemas):
fuente
Si estás en la rama A, haz:
Probado en git versión 1.7.8
fuente
Para hacer realmente una fusión que solo toma información de la rama 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 tiene que hacer ramificaciones adicionales, y actúa como una confirmación de fusión normal.
Sin embargo, esto no juega bien con los submódulos.
fuente
Si bien menciono en " comando git para hacer una rama como otra " cómo simular
git merge -s theirs
, tenga en cuenta que Git 2.15 (Q4 2017) ahora es más claro:Ver commit c25d98b (25 de septiembre de 2017) por Junio C Hamano (
gitster
) .(Fusionada por Junio C Hamano -
gitster
- en commit 4da3e23 , 28 sep 2017)-Xtheirs
es una opción de estrategia aplicada a la estrategia recursiva. Esto significa que la estrategia recursiva aun fusionará todo lo que pueda, y solo "theirs
" volverá a la lógica en caso de conflictos.Ese debate sobre la pertinencia o no de una
theirs
estrategia de fusión se trajo recientemente en este hilo de septiembre de 2017 .Reconoce hilos más antiguos (2008)
Menciona el alias:
Yaroslav Halchenko intenta abogar una vez más por esa estrategia, pero Junio C. Hamano agrega :
Junio agrega, como comentó Mike Beaton :
fuente
git merge -s ours <their-ref>
efectivamente dice 'marca confirmaciones hechas a <their-ref> en su rama como confirmaciones para ignorar permanentemente '; y esto es importante porque, si posteriormente se fusionan de los estados posteriores de su rama, sus cambios posteriores serán traídos sin los cambios ignorados nunca ser llevado en.Ver la respuesta ampliamente citada de Junio Hamano : si va a descartar el contenido comprometido, simplemente descarte los commits o, en cualquier caso, manténgalo fuera de la historia principal. ¿Por qué molestar a todos en el futuro leer mensajes de commit de commits que no tienen nada que ofrecer?
Pero a veces hay requisitos administrativos, o quizás alguna otra razón. Para aquellas situaciones en las que realmente tiene que registrar confirmaciones que no aportan nada, desea:
(edit: wow, ¿me las arreglé para equivocarme antes? Esto funciona).
fuente
Este utiliza un comando de árbol de lectura git plumbing, pero hace un flujo de trabajo general más corto.
fuente
Esto fusionará su newBranch en baseBranch existente
fuente
git commit --amend
al final de su ejemplo, o los usuarios pueden ver la confirmación de fusióngit log
y asumir que la operación se ha completado.Creo que lo que realmente quieres es:
Esto parece torpe, pero debería funcionar. Lo único que realmente no me gusta de esta solución es que el historial de git será confuso ... Pero al menos el historial se conservará por completo y no necesitará hacer algo especial para los archivos eliminados.
fuente
El equivalente (que mantiene el orden principal) a 'git merge -s theirs branchB'
Antes de fusionar:
!!! ¡Asegúrate de estar limpio!
Haz la fusión:
Lo que hicimos ? Creamos un nuevo commit en el que dos padres son nuestros y los suyos y el contenido del commit es branchB - suyo
Después de fusionar:
Más precisamente:
fuente
Esta respuesta fue dada por Paul Pladijs. Solo tomé sus órdenes e hice un alias git por conveniencia.
Edite su .gitconfig y agregue lo siguiente:
Entonces puedes "git merge -s suyo" ejecutando:
fuente
Hace poco necesitaba hacer esto para dos repositorios separados que comparten un historial común. Empecé con:
Org/repository1 master
Org/repository2 master
Quería
repository2 master
que se aplicaranrepository1 master
todos los cambios, aceptando todos los cambios que haría el repositorio2. En términos de git, esta debería ser una estrategia llamada-s theirs
PERO no existe. Tenga cuidado porque-X theirs
se llama como si fuera lo que quiere, pero NO lo mismo (incluso lo dice en la página del manual).La forma en que resolví esto fue ir
repository2
y hacer una nueva sucursalrepo1-merge
. En esa rama, corrígit pull [email protected]:Org/repository1 -s ours
y se fusiona bien sin problemas. Luego lo empujo al control remoto.Luego vuelvo
repository1
y hago una nueva sucursalrepo2-merge
. En esa rama, ejecutogit pull [email protected]:Org/repository2 repo1-merge
que se completará con problemas.Finalmente, necesitaría emitir una solicitud de fusión
repository1
para convertirlo en el nuevo maestro, o simplemente mantenerlo como una rama.fuente
Una forma simple e intuitiva (en mi opinión) de dos pasos de hacerlo es
seguido por
(que marca las dos ramas como fusionadas)
La única desventaja es que no elimina los archivos que se han eliminado en la rama B de su rama actual. Una simple diferencia entre las dos ramas luego mostrará si hay alguno de estos archivos.
Este enfoque también deja en claro en el registro de revisión posterior lo que se hizo y lo que se pretendía.
fuente