¿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 mergetool
tiempo 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 recursive
aquí 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
.MERGING
estado. Entonces puedogit merge --abort
e 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 path
pá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 path
o usar commit hash.git pull -X theirs
crea un commit de fusión si hay conflictos (por ejemplo, si otro committer se ejecutógit push -f
en 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 theirs
Del 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 --theirs
para operar en un solo archivo en conflictogit checkout <ref to theirs> -- the/conflicted.file
; y luegogit add
sus 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 -u
lugar 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 status
entrecheckout
yadd
, el archivo aún se muestra como "ambos modificados".git reset --hard
y 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 theirs
respuestas 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
master
con la rama que desee):¿Como funciona?
git fetch
lo hacegit pull
pero sin fusionarse . Luegogit reset --hard
hace 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 theirs
atragantó 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 --continue
o ungit commit --allow-empty
comando 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_EDITMSG
archivo, 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 --theirs
es ú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-version
rama 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-version
incorporar 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