2012-02-03 16 views
34

Quiero aprovechar el algoritmo git-merge en dos archivos arbitrarios en un repositorio git. Aquí es mi directorio de trabajo:ejecute el algoritmo de combinación git en dos archivos individuales

folder/ 
    file1 
    file2 

archivo1 y archivo2 son similares, pero quiero ver cómo git se fusionaría ellos como si fueran diferentes versiones de un mismo archivo. En otras palabras, quiero algo como esto:

git merge-files file1 file2 > merge_of_file1_file2 

¿Hay alguna manera de hacerlo?

Respuesta

43

Esto realmente no tiene sentido, porque no está proporcionando un antepasado común. Si usted tiene uno, sin embargo, puede utilizar:

git merge-file <current-version> <common-ancestor> <other-version> 

Esto coloca el resultado en el archivo de versión actual; si los quiere en otra parte, use:

git merge-file -p <current> <common> <other> > <dest> 

Necesita el ancestro común para proporcionar algo a considerar respecto a los cambios. Puede hackearlo, proporcionando un archivo vacío o una copia de una versión anterior de uno de ellos del historial de su repositorio, pero la calidad de los resultados dependerá de qué tan bien seleccione un antecesor común, ya que está fusionando las dos diferencias. , entre eso y cada una de las nuevas versiones. Un archivo vacío solo funcionará bien si los dos son muy similar (muchas ejecuciones de al menos tres líneas idénticas).

Sin eso, todo lo que realmente puede hacer es mirar las diferencias:

git diff --no-index file1 file2 
+2

¿Qué tal si usamos una copia de uno de los archivos como antepasado común? –

+1

@CarlG, Digamos que el archivo2 contiene una línea más que el archivo1. Si elige file1 como antecesor, esta línea se interpreta como una adición, por lo que la fusión será el archivo 2. Si elige el archivo 2 como el antecesor, la línea se interpreta como una eliminación y se obtiene el archivo 1 como resultado. –

+2

@CarlG Para decirlo de otra manera, si comienzas con A y un lado lo cambia a B mientras que el otro lado lo mantiene como A, el resultado fusionado es claramente B. – Cascabel

29

Por lo que estamos tratando de hacer:

touch file3 #empty 
git merge-file file1 file3 file2 

esto va a hacer una fusión a tres bandas de fichero1 y file2 con file3 (archivo vacío) como base.

Tenga en cuenta que esto escribe en el archivo1. Por supuesto, puede hacer lo siguiente si no se desea:

touch file3 
cp file1 merge_of_file1_file2 
git merge-file merge_of_file1_file2 file3 file2 
+1

Verifiqué que esto funciona (a través de Git Bash). Esta es la función de fiesta que escribí para encapsular esto en un solo comando: '' ' función de fusión() { \t toque __merge_result__ \t git merge-archivo $ 1 __merge_result__ $ 2 \t rm __merge_result__ } ' '' –

Cuestiones relacionadas