¿Cómo resuelvo un conflicto de fusión de git a favor de los cambios retirados?
Básicamente, necesito eliminar todos los cambios conflictivos de un árbol de trabajo sin tener que pasar por todos los conflictos con un git mergetooltiempo manteniendo todos los cambios libres de conflictos. Preferiblemente haciendo esto mientras tira, no después.
git
git-merge
git-merge-conflict
sanmai
fuente
fuente

Respuestas:
O, simplemente, para el repositorio predeterminado:
Si ya estás en estado de conflicto ...
fuente
-s recursiveaquí es redundante, ya que esa es la estrategia de fusión predeterminada. Entonces podría simplificarlo agit pull -X theirs, que es básicamente equivalente agit pull --strategy-option theirs.MERGINGestado. Entonces puedogit merge --aborte intentarlo de nuevo, pero cada vez que termino ocurre una fusión. ... Sé que una rebase fue empujada a mi río arriba, así que ¿quizás eso está causando esto?git checkout --theirs path/to/file. Lo usé durante el rebase y obtuve resultados inesperados. Explicación encontrada en el documento: tenga en cuenta que durante git rebase y git pull --rebase, el nuestro y el suyo pueden aparecer intercambiados; --ours proporciona la versión de la rama en la que se vuelven a basar los cambios, mientras que --theirs le da la versión de la rama que contiene el trabajo que se está volviendo a crear.git checkout --theirs/--ours pathpágina de manual indica que funciona para rutas no fusionadas . Entonces, si no hubo conflicto en la ruta, ya está fusionado, este comando no hará nada. Esto podría ocasionar problemas cuando desee, por ejemplo, la versión 'de ellos' de una subcarpeta completa. Entonces, en tal caso, sería más seguro hacergit checkout MERGE_HEAD patho usar commit hash.git pull -X theirscrea un commit de fusión si hay conflictos (por ejemplo, si otro committer se ejecutógit push -fen el control remoto). Si no desea fusionar confirmaciones, ejecute en su lugargit fetch && git reset --hard origin/master.Puede usar la opción de estrategia "suya" recursiva :
git merge --strategy-option theirsDel hombre :
Nota: como dice la página de manual, la opción de estrategia de fusión "nuestra" es muy diferente de la estrategia de fusión "nuestra" .
fuente
git checkout --theirspara operar en un solo archivo en conflictogit checkout <ref to theirs> -- the/conflicted.file; y luegogit addsus cambios.Si ya está en estado de conflicto y desea aceptar todos los suyos:
Si quieres hacer lo contrario:
Esto es bastante drástico, así que asegúrate de que realmente quieres borrar todo así antes de hacerlo.
fuente
.y especifique los archivos en lugar del punto que desea pagar. menos "drástico" y exactamente lo que quieres hacer, presumiblemente.git add -ulugar para omitir archivos que no están bajo control de versiones.Bien, imagina el escenario en el que estaba:
Intentas un
merge, o tal vez uncherry-pick, y te detienen conAhora, ve el archivo en conflicto y realmente no desea conservar sus cambios. En mi caso anterior, el archivo estaba en conflicto solo con una nueva línea que mi IDE había agregado automáticamente. Para deshacer sus cambios y aceptar los de ellos, la forma más fácil es:
Lo contrario de esto (para sobrescribir la versión entrante con su versión) es
Sorprendentemente, no pude encontrar esta respuesta muy fácilmente en la red.
fuente
git statusentrecheckoutyadd, el archivo aún se muestra como "ambos modificados".git reset --hardy luegogit pull [remote server name] [branch name] -Xtheirs(deshace la fusión y luego coloca las cosas nuevas encima de mis cosas), no estoy seguro de si esto es lo que quieres.Las
git pull -X theirsrespuestas pueden crear una confirmación de fusión fea o emitir unSi simplemente desea ignorar cualquier modificación local a los archivos desde el repositorio, por ejemplo, en un cliente que siempre debe ser un espejo de un origen, ejecute esto (reemplace
mastercon la rama que desee):¿Como funciona?
git fetchlo hacegit pullpero sin fusionarse . Luegogit reset --hardhace que su árbol de trabajo coincida con el último commit. Todos sus cambios locales a los archivos en el repositorio se descartarán , pero los nuevos archivos locales se dejarán solos.fuente
git fetch && git reset --hard {remote}/{branch}fue lo que resolvió mi problema. Necesitaba deshacerme por completo de mis propios cambios a favor del estado "de ellos" de una rama, pero segit pull -X theirsatragantó con algunos archivos movidos / renombrados. ¡Gracias!Después de git merge, si tienes conflictos y quieres tu o sus
fuente
Para resolver todos los conflictos con la versión en una rama en particular:
Entonces, si ya está en el estado de fusión y desea mantener la versión maestra de los archivos en conflicto:
fuente
git cherry-pick --continueo ungit commit --allow-emptycomando para confirmar estos cambios, y parece que no hay ningún sistema detrás del cual se requiera el comando, lo que hace que la automatización de este sea un problema. Actualmente estoy resolviendo esto probando la existencia de un.git/COMMIT_EDITMSGarchivo, pero eso parece hacky y frágil, y todavía no estoy convencido de que siempre funcione.git add), puede resolver el resto a través de esto.git checkout --ours/git checkout --theirses útil también.Por favor, no es que a veces esto no funcione :
o
En cambio, hice esto, asumiendo que HEAD es nuestro y MERGE_HEAD es de ellos.
o:
Después de hacer esto y estamos bien:
Si desea comprender más, vea la maravillosa publicación de torek aquí: git checkout --ours no elimina archivos de la lista de archivos no fusionados
fuente
Usuarios de IDE VS Code (Git integrado):
Si desea aceptar todos los cambios entrantes en el archivo de conflicto , realice los siguientes pasos.
Del mismo modo, puede hacerlo para otras opciones como Aceptar todo, Aceptar todo actual, etc.
fuente
Tenía una
next-versionrama de larga duración con toneladas de eliminaciones en archivos que habían cambiadodevelop, archivos que se habían agregado en diferentes lugares en ambas ramas, etc.Quería
next-versionincorporar todo el contenido de la ramadevelop, todo en una enorme confirmación de fusión.La combinación de los comandos anteriores que funcionó para mí fue:
No es una respuesta nueva, solo combina partes de muchas respuestas, en parte para asegurar que podría necesitar todas estas respuestas.
fuente
Si ya está en estado de conflicto, y no desea pagar la ruta una por una. Puedes intentar
fuente
Una situación que he encontrado útil si quiero que master refleje los cambios de una nueva rama de tema. He notado que -Xtheirs no se fusiona sin conflictos en algunas circunstancias ... por ejemplo
En este caso la solución que encontré fue
de topicFoo, primero fusionarse en master usando la estrategia -s our, esto creará la confirmación falsa que es solo el estado de topicFoo. $ git merge -s nuestro maestro
compruebe la confirmación de fusión creada
ahora revisa la rama maestra
fusionar la rama del tema nuevamente, pero esta vez use la estrategia recursiva -Xtheirs, esto ahora le presentará una rama maestra con el estado de topicFoo.
fuente