theirs how content conflicts git merge-conflict-resolution

how - Resolviendo un conflicto de Git con archivos binarios.



git resolve conflicts using theirs (9)

He estado usando Git en Windows (msysgit) para realizar un seguimiento de los cambios para algunos trabajos de diseño que he estado haciendo.

Hoy he estado trabajando en una PC diferente (con repositorio remoto) y ahora estoy tratando de fusionar las ediciones hechas hoy de nuevo en mi versión local habitual en mi computadora portátil.

En mi computadora portátil, he usado git pull brian master para incorporar los cambios a mi versión local. Todo estaba bien, aparte del documento principal de InDesign, esto muestra como un conflicto.

La versión en la PC ( brian ) es la última que quiero conservar, pero no sé qué comandos le dicen a la repo que use esta.

Intenté copiar directamente el archivo en mi computadora portátil, pero esto parece interrumpir todo el proceso de combinación.

¿Alguien puede señalarme en la dirección correcta?


De los documentos de git checkout

git checkout [-f|--ours|--theirs|-m|--conflict=<style>] [<tree-ish>] [--] <paths>...

--ours
--theirs
Cuando revise las rutas del índice, revise la etapa # 2 ( ours ) o la # 3 (las theirs ) para ver las rutas sin combinar.

El índice puede contener entradas no combinadas debido a una combinación fallida anterior. De forma predeterminada, si intenta retirar una entrada de este tipo del índice, la operación de pago fallará y no se registrará nada. Usar -f ignorará estas entradas no combinadas. Los contenidos de un lado específico de la fusión se pueden desproteger del índice usando --ours o --theirs . Con -m , los cambios realizados en el archivo del árbol de trabajo se pueden descartar para volver a crear el resultado de combinación en conflicto original.


Debe resolver el conflicto manualmente (copiando el archivo) y luego confirmar el archivo (no importa si lo copió o usó la versión local) de esta manera

git commit -a -m "Fix merge conflict in test.foo"

Normalmente, Git se entrega automáticamente después de la fusión, pero cuando detecta conflictos que no puede resolver por sí solo, aplica todos los parches que resolvió y deja el resto para que usted lo resuelva y confirme manualmente. La página de manual de Git Merge , el curso acelerado de Git-SVN o this entrada de blog podrían arrojar algo de luz sobre cómo se supone que funciona.

Edición: vea la publicación a continuación, no tiene que copiar los archivos usted mismo, pero puede usar

git checkout --ours -- path/to/file.txt git checkout --theirs -- path/to/file.txt

para seleccionar la versión del archivo que desea. Copiar / editar el archivo solo será necesario si desea una combinación de ambas versiones.

Por favor, marque la respuesta de mipadis como la correcta.


Encontré un problema similar (al querer tirar un commit que incluía algunos archivos binarios que causaron conflictos cuando se fusionaron), pero encontré una solución diferente que se puede hacer completamente usando git (es decir, no tener que copiar los archivos manualmente). Pensé que lo incluiría aquí, así que al menos puedo recordarlo la próxima vez que lo necesite. :) Los pasos se ven así:

% git fetch

Esto recupera los últimos compromisos del repositorio remoto (es posible que deba especificar un nombre de sucursal remota, dependiendo de su configuración), pero no intenta combinarlos. Graba el commit en FETCH_HEAD.

% git checkout FETCH_HEAD stuff/to/update

Esto toma la copia de los archivos binarios que quiero y sobrescribe lo que está en el árbol de trabajo con la versión obtenida de la rama remota. git no intenta realizar ninguna fusión, por lo que acaba de terminar con una copia exacta del archivo binario de la rama remota. Una vez hecho esto, puede agregar / confirmar la nueva copia como de costumbre.


La respuesta de Mipadi no funcionó para mí, necesitaba hacer esto:

git checkout --su ruta / a / archivo.bin

o, para mantener la versión que se fusiona en:

git checkout - theirs ruta / a / archivo.bin

entonces

git agregar ruta / a / archivo.bin

Y luego pude volver a hacer "git mergetool" y continuar con el siguiente conflicto.


Me he encontrado con dos estrategias para gestionar la diferenciación / fusión de archivos binarios con Git en Windows.

  1. Tortoise git te permite configurar herramientas de diferencia / fusión para diferentes tipos de archivos en función de sus extensiones de archivo. Ver 2.35.4.3. Diff / Merge Advanced Settings http://tortoisegit.org/docs/tortoisegit/tgit-dug-settings.html . Esta estrategia, por supuesto, se basa en la disponibilidad de herramientas adecuadas de combinación / fusión.

  2. Usando los atributos de git, puede especificar una herramienta / comando para convertir su archivo binario en texto y luego dejar que su herramienta predeterminada de diferenciar / fusione haga su trabajo. Consulte http://git-scm.com/book/it/v2/Customizing-Git-Git-Attributes . El artículo incluso da un ejemplo del uso de metadatos para diferenciar imágenes.

Conseguí ambas estrategias para trabajar con archivos binarios de modelos de software, pero optamos por el git de tortuga porque la configuración era fácil.


Para resolver manteniendo la versión en su rama actual (ignore la versión de la rama en la que se está fusionando), simplemente agregue y confirme el archivo:

git commit -a

Para resolver sobrescribiendo la versión en su rama actual con la versión de la rama en la que se está fusionando, primero debe recuperar esa versión en su directorio de trabajo y luego agregarla / confirmarla:

git checkout otherbranch theconflictedfile git commit -a

Explicado con más detalle


Si el binario es algo más que un archivo DLL o algo que se puede editar directamente como una imagen, o un archivo de mezcla (y no necesita desechar / seleccionar un archivo u otro), una fusión real sería algo como:

Sugiero buscar una herramienta de diferencias orientada a lo que son archivos binarios, por ejemplo, hay algunos gratuitos para archivos de imágenes, por ejemplo.

y compararlos.

Si no existe una herramienta de diferencias para comparar sus archivos, entonces si tiene el generador original del archivo bin (es decir, existe un editor para él ... como blender 3d, puede inspeccionar manualmente esos archivos, también vea los registros y pregunte a la otra persona qué debe incluir) y haga una salida de los archivos con https://git-scm.com/book/es/v2/Git-Tools-Advanced-Merging#_manual_remerge

$ git show :1:hello.blend > hello.common.blend $ git show :2:hello.blend > hello.ours.blend $ git show :3:hello.blend > hello.theirs.blend


También puedes superar este problema con

git mergetool

lo que hace que git cree copias locales del binario en conflicto y genere su editor predeterminado en ellos:

  • {conflicted}.HEAD
  • {conflicted}
  • {conflicted}.REMOTE

Obviamente, no puedes editar archivos binarios en un editor de texto. En su lugar, copia el nuevo archivo {conflicted}.REMOTE {conflicted} sobre {conflicted} sin cerrar el editor. Luego, cuando cierre el editor, git verá que la copia de trabajo no decorada se ha modificado y que su conflicto de combinación se resuelve de la manera habitual.


git checkout acepta una opción --ours o --theirs para casos como este. Por lo tanto, si tiene un conflicto de fusión y sabe que solo quiere el archivo de la rama en la que se está fusionando, puede hacer lo siguiente:

$ git checkout --theirs -- path/to/conflicted-file.txt

para utilizar esa versión del archivo. Del mismo modo, si sabe que desea que su versión (no la que se fusione) puede usar

$ git checkout --ours -- path/to/conflicted-file.txt