2010-01-18 40 views
13

Tengo un archivo binario en my_branch, y cuando necesito hacer cambios en él, git por supuesto no lo fusionará.¿Cómo fusiono un archivo binario?

Así que lo que hago ahora es:

git checkout my_branch 
# make a change to gui.bin 
mv gui.bin ~/ 
git commit -a 
mv ~/gui.bin . 
git commit -a 
# git rebase to 1 commit 
git checkout master 
git merge my_branch 

Pero, ¿existe una manera más fácil?

+0

Ver también http: // stackoverflow.com/questions/1910444/git-merge-s-theirs-needed-but-i-know-it-doesnt-exist/1910479 # 1910479 – VonC

Respuesta

17

No estoy muy seguro de a lo que apunta su caso de prueba. Parece que se está moviendo gui.bin fuera del camino y luego volviendo a ponerlo como estaba ...

A menudo, no es necesario fusionar los archivos binarios, solo quiere elegir una versión definitiva de uno lugar u otro. Donde genuinamente deben fusionarse, o necesita una herramienta de fusión personalizada, o utiliza algún tipo de editor y mucha intervención manual.

Me di cuenta de que usa commit -a en su ejemplo. Un primer paso para evitar conflictos innecesarios es no comprometer ningún archivo binario que pueda ser tocado de manera incidental a menos que desee comprometerlos. Si solo git add los archivos que necesita confirmar y confirmar sin -a, entonces esto ayudará. Alternativamente, si solo hay un archivo que no desea confirmar, puede add -u y reiniciarlo antes de realizar una confirmación.

git add -u 
git reset -- dontcommit.dat 
git commit 

Cuando fusiona las ramas que tienen ambos un cambio binario, es posible que desee mantener una versión y no la otra. Después de una fusión donde git que su son conflictos en su binario se puede decir git utilizar la versión en la rama que usted estaba en como esto dice:

git checkout --ours binary.dat 
git add binary.dat 

o de la rama que se está fusionando en como esto :

git checkout --theirs binary.dat 
git add binary.dat 
+0

Ahora este aspecto realmente bueno. Entonces solo para aclarar. Si he hecho "git checkout master". Entonces debería usar el último bloque de código con "theirs" y luego fusionar? – Louise

+0

Su pregunta no es 100% clara para mí. Si estás en 'master' (después de un pago exitoso), y' git merge otherbranch', si esto produce conflictos en 'binary.dat', entonces los últimos dos comandos en mi respuesta elegirán la versión de' otherbranch' y marque el conflicto como resuelto. A continuación, puede 'git commit' para cometer el conflicto resuelto. –

+0

Excelente. Gracias =) – Louise

10

se puede utilizar el controlador integrado de binary fusión:

binary: Keep the version from your branch in the work tree, but 
leave the path in the conflicted state for the user to sort out. 

ejemplo .gitattributes línea:

*.bin -crlf -diff merge=binary 

dice git no agregar los finales de línea, no para diferenciar, y para mantener el versión local

http://git-scm.com/docs/gitattributes

que sólo conserva su copia de trabajo ...

otra manera es usar un controlador de combinación personalizada:

[merge "binmerge"] 
    name = my binary merge script 
    driver = binmerge.sh %O %A %B 

que podrían comprobar el archivo en conflicto con una lista de archivos que siempre debe ser sobrescrita por la versión local. ..

utilizar un controlador de combinación, lo definen en la configuración, a continuación, especifique cuáles son los caminos que debe ser usado en en .gitattributes, así:

*.bin -crlf -diff merge=binmerge 

binmerge.s h se llamará para manejar la fusión. básicamente, puede hacer algo como:

#!/bin/sh 
echo "Performing merge of binary object ($1, $2, $3)" 
touch $2 
exit 0 
+0

De acuerdo, los controladores de git son completamente nuevos para mí. ¿Es algo que puse en el archivo de configuración .git? – Louise

+1

sí, eso entraría en ~/.gitconfig o .git/config – jspcal

+0

Muy interesante. Entonces, ¿debería simplemente cambiar driver = gui.bin? – Louise