tag remove practices best git merge branch conflict manual

remove - git tag push



Git: cómo forzar el conflicto de combinación y la fusión manual en el archivo seleccionado (2)

Mantenemos la aplicación web que tiene una rama maestra común y muchas ramas paralelas, una para cada instalación, cada una tiene pocos cambios específicos. El código fuente se gestiona en git y es una herramienta excelente cuando necesitamos funciones de transferencia y correcciones de errores de la rama principal en paralelo. Pero son pocos los archivos que son confidenciales y la fusión automática suele dar malos resultados. Por lo tanto, la fusión sería mucho más fácil si se pueden marcar de alguna manera y cada fusión daría lugar a un conflicto que requiere una fusión manual.

Busqué una respuesta:

  1. Estoy usando --no-commit y --no-ff merge options, pero no es lo mismo.
  2. Here y here alguien hace la misma pregunta pero sin solución.
  3. Un caso similar parece ser cómo evitar que el archivo se fusione utilizando .gitattributes que contenga: somefile.php merge = ours . Traté de encontrar alguna opción de combinación que generaría conflicto o forzaría la fusión manual, pero no encontré ninguna hasta el momento.
  4. .gitattributes que contiene: somefile.php -merge nunca se fusiona automáticamente y, por lo tanto, forza la fusión manual. Es una solución al 90%, pero lo que busco es probar la fusión automática y marcarla como conflicto independientemente de si tiene éxito o no. Pero esto es lo más cercano a la solución. (... gracias Charles Bailey por aclaración ...)
  5. Alguien sugiere escribir un controlador de combinación personalizado ( 1 , 2 ), pero no está claro cómo hacerlo.

editar: variante 4. descripción


La opción 5, un controlador de combinación personalizado, es probablemente la forma de acercarse más a lo que desea. Es sorprendentemente fácil de hacer. A continuación se muestra un ejemplo de uno que creo que debería acercarlo bastante al comportamiento que desea.

Primero, cree un script de combinación de controladores llamado merge-and-verify-driver . Hágalo ejecutable y colóquelo en una ubicación adecuada (es posible que desee considerar la verificación de esta secuencia de comandos en el repositorio, incluso, ya que el archivo de configuración del repositorio dependerá de ello). Git va a ejecutar este script de shell para realizar la fusión de los archivos confidenciales:

#!/bin/bash git merge-file "${1}" "${2}" "${3}" exit 1

Esto solo hace el comportamiento de fusión predeterminado que normalmente hace Git. La diferencia clave es que la secuencia de comandos siempre devuelve un valor distinto de cero (para indicar que hubo un conflicto, incluso si la fusión se resolvió realmente sin conflictos).

Luego, debe decirle a Git sobre la existencia de su controlador de combinación personalizado. Usted hace esto en el archivo de configuración del repositorio ( .git/config ):

[merge "verify"] name = merge and verify driver driver = ./merge-and-verify-driver %A %O %B

En este ejemplo, puse merge-and-verify-driver en el directorio de nivel superior del repositorio ( ./ ). Tendrá que especificar la ruta de la secuencia de comandos en consecuencia.

Ahora, solo necesita dar a los archivos confidenciales los atributos adecuados para que el controlador de combinación personalizada se use al fusionar esos archivos. Agregue esto a su archivo .gitattributes :

*.sensitive merge=verify

Aquí, le dije a Git que cualquier archivo con un nombre que coincida con el patrón *.sensitive debería usar el controlador de combinación personalizado. Obviamente, debe usar un patrón que sea apropiado para su (s) archivo (s).