2012-01-26 15 views
5

Digamos que tengo un poco de código que se ordenó, pero el pedido no es un requisito técnico.Combinar la resolución de conflictos sobre nuevo código

apple 
kiwi 
strawberry 

y luego tengo dos temas que desea combinar en cuyo diffs aspecto:

TOPIC BRANCH: orange 
    kiwi 
+ orange 
    strawberry 

Y también

TOPIC BRANCH: pear 
    kiwi 
+ pear 
    strawberry 

¿Hay alguna manera de que estos dos parches a se resuelve automáticamente? Me parece que es un conflicto de fusión, ya que compiten por la misma nueva línea. Una solución que he llegado con es reordenar uno de los cambios ya que el orden de clasificación es sólo una exigencia suave (donde las frutas son en realidad funcionan las definiciones).

TOPIC BRANCH: pear' 
    apple 
+ pear 
    kiwi 

Así que ahora podemos fusionamos orange y pear' juntos para formar:

_ apple 
p pear 
_ kiwi 
o orange 
_ strawberry 

¿Hay otras formas de resolver este tal que el pedido se puede mantener? También pensé en pear tener que descender desde orange de modo que orange siempre tiene prioridad y ya no habría un conflicto de fusión. Pero esto es una falsa dependencia ya orange y pear son dos ramas de características independientes.

Uno podría ser mainlined en el maletero antes que el otro, pero que no se refiere a las ramas de integración.

Edit: Me di cuenta de que se podían mantener dos piezas (¿solo adiciones, supongo?) Podría haber dos estrategias de fusión llamadas "yo primero" y "tú primero" de modo que un orden ambiguo podría resolverse no -interactivamente entre dos ramas.

+0

¿Has mirado en git combinar estrategias? hombre git-merge y busca las diversas estrategias, incluida la recursiva llamada paciencia. – idlethread

Respuesta

7

El enfoque básico es definir una herramienta de combinación personalizada y luego usar el GIT Los atributos de características que contar git usar esa herramienta de combinación personalizada para dichos archivos.

Ejemplo:

  1. crear un repositorio de pruebas:

    $ git init t 
    $ cd t 
    
  2. definen una herramienta de combinación personalizada llamada mymerge:

    $ git config merge.mymerge.name "my custom merge tool" 
    $ git config merge.mymerge.driver "cat '%A' '%B'|sort -u >'%A'.tmp && mv '%A'.tmp '%A'" 
    

    La herramienta de fusión por encima de concatena los archivos, tipos las líneas resultantes, y luego elimina las líneas duplicadas. Si no desea cambiar el orden, reemplace el comando anterior con un script personalizado que haga lo que desee. Ver git help attributes para más información.

  3. git

    dicen que desea utilizar mymerge al fusionar cualquier archivo llamado foo.txt en el repositorio:

    $ echo "foo.txt merge=mymerge" >.gitattributes 
    $ git add .gitattributes 
    $ git commit -m "tell git to use the mymerge merge tool for foo.txt" 
    
  4. hacen algunos datos de prueba en tres ramas:

    $ printf 'apple\nkiwi\nstrawberry\n' >foo.txt 
    $ git add foo.txt 
    $ git commit -m "common ancestor version of foo.txt" 
    $ git checkout -b orange 
    $ printf 'apple\nkiwi\norange\nstrawberry\n' >foo.txt 
    $ git commit -a -m "add orange" 
    $ git checkout -b pear master 
    $ printf 'apple\nkiwi\npear\nstrawberry\n' >foo.txt 
    $ git commit -a -m "add pear" 
    
  5. fusionar las ramas (nota sin conflictos!):

    $ git checkout master 
    $ git merge orange 
    $ git merge pear 
    
  6. ¡ganancia!

    $ cat foo.txt 
    apple 
    kiwi 
    orange 
    pear 
    strawberry 
    
0

Si el código que necesita ser ordenado se encuentra en un archivo separado, se puede utilizar una herramienta de combinación personalizada que toma dos archivos de entrada, los lee y da salida a su contenido, ordenados en su archivo de resultados. Entonces le dirías a git que use la herramienta de fusión personalizada para este archivo. No sé lo suficiente acerca de git para saber si puede establecer herramientas de fusión personalizadas basadas en el tipo de archivo o expresiones regulares de algún tipo, pero es una idea que podría darle lo que desea.

Cuestiones relacionadas