2009-05-27 10 views
59

Tengo FileA en branchA y FileB en branchB.No se pueden distinguir archivos en dos ramas separadas en Git

El problema es que puedo acceder a un solo archivo a la vez. Me gustaría poder comparar los archivos por FileMerge o meld, ya que son los únicos diffTools que he encontrado para Mac.

¿Cómo se puede diferenciar por fusión/FileMerge los dos archivos?


[Resuelto]: primera Problema desarrollada: FileMerge no permite la entrada estándar

Masi: Puede utilizar opendiff to allow FileMerge tener archivos de entrada estándar. Entonces, el siguiente problema es encontrar cómo hacer que la herramienta de diferencias de git use opendiff.


segundo problema desarrollada: para hacer herramienta de diferencias de Git para utilizar opendiff en Mac

+1

El problema no es que no está usando git opendiff, es que README no existe en el maestro. –

Respuesta

66

puede utilizar "git mergetool" para la fusión, y en git moderna (es decir, la versión 1.6.3 y posteriores) "git difftool" para comparar utilizando herramientas gráficas. Por supuesto, tendrías que configurarlos primero, pero hacen una autodetección (con algunas preferencias codificadas, por supuesto), y si recuerdo correctamente, la compatibilidad con opendiff está incorporada.

Y entonces por supuesto que sería capaz de usar su herramienta gráfica (opendiff/FileMerge) del mismo modo que ordinaria "git diff", por ejemplo

prompt> git difftool somebranch:UNREADME otherbranch:README 
+0

http://changesapp.com/ Como escribí git-difftool está disponible sólo en la versión 1.6.3 de Git y más tarde (compruebe la salida de "git --version"). –

+0

El comentario sobre "git diff" (y el uso de diff.external) no se trata de mi respuesta ... –

+0

@problem resuelto: MacPorts tiene el viejo Git. Necesitaba actualizarlo -- ¡Gracias por su respuesta! –

37

Si actualmente la comprobación hacia fuera a branchA, por ejemplo, puede utilizar el comando:

git diff branchB path/to/common/file/between/branches.txt 

Puede editar el diff si desea un subconjunto de los cambios, o dejarlo tal como está, y git apply el parche como parche. En cuanto a una herramienta de GUI que hace esto, con suerte alguien más tendrá una sugerencia allí.

61

git admite los nombres de las sucursales como parte de las rutas del repositorio. Por ejemplo, si usted tiene los siguientes archivos en su repositorio, README solamente en master y UNREADME sólo en branch:

master:README 

branch:UNREADME 

Puede diff ellos a través de git con:

git diff branch:UNREADME master:README 

Usted puede obtener un artefacto repositorio a la salida estándar con git show:

git show branch1:UNREADME 

Así que si su diff externo puede tak e 2 archivos en el indicador bash, puede diff con algo como:

diff-command <(git show branch1:UNREADME) <(git show master:README) 

Cuando la sintaxis <(...) fiesta toma la salida de la orden cerrado, lo ejecuta en un tubo y coloca la ruta del archivo de la tubería de la línea de comando.

+0

¿Cómo se puede hacer lo mismo con un archivo externo-diff-fusión? - corro sin éxito en Mac% -a abierta FileMerge Heee/maestro: maestro .profile: .profile –

+1

FileMerge.app no ​​acepta la entrada de la entrada estándar. Puede tener suerte con este script que produjo Google: http://kerneltrap.org/mailarchive/git/2007/11/21/435536 –

+1

También puede probar Changes.app, que tiene una utilidad de línea de comandos y puede aceptar la entrada de stdin ... –

2

De the docs, se necesita algo similar a lo siguiente en su archivo .git/config:

# Our diff algorithm 
[diff] 
    external = opendiff 
Cuestiones relacionadas