2009-12-28 54 views
87

¿Cómo podemos obtener la diferencia entre dos repositorios git?Obteniendo la diferencia entre dos repositorios

El escenario: Tenemos un repo_a y repo_b. Este último fue creado como una copia de repo_a. Ha habido un desarrollo paralelo en ambos repositorios después. ¿Hay alguna manera de que podamos enumerar las diferencias de las versiones actuales de estos dos repositorios?

+2

posible duplicado de [¿Cómo comparo dos repositorios git?] (Http://stackoverflow.com/questions/687450/how-do-i-compare-two-git-repositories) –

Respuesta

136

En repo_a:

git remote add -f b path/to/repo_b.git 
git remote update 
git diff master remotes/b/master 
git remote rm b 
+0

excelente explicación, hice lo que necesitaba :) – Zlatko

+0

Tuve que especificar controles remotos/b/master según la otra respuesta: http://stackoverflow.com/a/4710379/284051 –

+1

¿Qué pasa si necesita comparar repo_a/master con una etiqueta específica de repo_b? –

7

Una vez que tenga ambas ramas en un repositorio, puede hacer un git diff. Y conseguir que en un repositorio es tan fácil como

git fetch /the/other/repo/.git refs/heads/*:refs/remotes/other/* 
+0

¿Hay alguna manera de seleccionarlos? historia con un pequeño cambio: por ejemplo, en el archivo de repos remoto se coloca en un directorio, pero quiero aplicar los cambios al mismo archivo, pero que se coloca en un directorio diferente en el repositorio local? –

+0

Si está hablando de un pequeño cambio, creo que lo más fácil sería simplemente hacer una diferencia y luego volver a aplicarla al otro archivo usando el parche. –

+0

El parche no se aplica debido a los diferentes nombres de archivo a pesar de que en esos mismos archivos están –

2

Ver http://git.or.cz/gitwiki/GitTips, sección "¿Cómo comparar dos repositorios locales" en "General".

En resumen que está utilizando la variable de entorno GIT_ALTERNATE_OBJECT_DIRECTORIES tener acceso a la base de datos objeto del otro repositorio, y el uso de git rev-parse con --git-dir/GIT_DIR para convertir nombre simbólico en otro depósito a SHA-1 identificador.

versión moderna sería algo como esto (suponiendo que esté en 'repo_a'):

 
GIT_ALTERNATE_OBJECT_DIRECTORIES=../repo_b/.git/objects \ 
    git diff $(git --git-dir=../repo_b/.git rev-parse --verify HEAD) HEAD 

donde ../repo_b/.git es camino a la base de datos objeto de repo_b (sería repo_b.git si fuera repositorio desnudo) Por supuesto, puede comparar versiones arbitrarias, no solo HEADs.


Tenga en cuenta que si repo_a y repo_b son el mismo repositorio, podría tener más sentido de poner a ambos en el mismo repositorio, ya sea usando "git remote add -f ..." para crear alias (s) para el repositorio de actualizaciones repetidas, u obe off "git fetch ..."; como se describe en otras respuestas.

4
git diff master remotes/b 

Eso es incorrecto. remotes/b es un control remoto, pero no una rama.

Para conseguir que funcione, que tenía que hacer:

git diff master remotes/b/master 
0

Su mejor opción es tener ambos repos en su máquina local y utilizar el comando linux diff con los dos directorios como parámetros:

diff -r repo-A repo-B

+0

La única manera de hacer que esto se pueda utilizar es cambiar el nombre de uno de los directorios .git. esto reduce a dos líneas páginas de diferencias que no importan. He estado allí, hecho eso, vine aquí en busca de una mejor respuesta. – hildred

2

Meld puede comparar directorios:

meld directory1 directory2 

Sólo tiene que utilizar los directorios de los dos repositorios Git y obtendrá una buena comparación gráfica:

enter image description here

Al hacer clic en uno de los objetos azules, se puede ver lo que ha cambiado.

+0

Meld se congela mientras se comparan los proyectos en mi solución VS, BeyondCompare no lo es. –

+0

en OSX: carpeta diff -rq carpeta1 – Mark

0

Uso PyCharm, que tiene grandes capacidades para comparar carpetas y archivos.

Simplemente abra la carpeta principal para ambos repositorios y espere hasta que se indexe. Luego puede hacer clic derecho en una carpeta o archivo y Compare to... y elegir la carpeta/archivo correspondiente en el otro lado.

Muestra no solo qué archivos son diferentes sino también su contenido. Mucho más fácil que la línea de comandos.

3

Se pueden añadir otros repo por primera vez como un control remoto para tu repositorio actual:

git remote add other_name PATH_TO_OTHER_REPO 

Luego descarga Brach de ese remoto:

git fetch other_name branch_name:branch_name 

esto crea esa rama como una nueva rama en su actual repo, entonces puede diferenciar esa rama con cualquiera de sus ramas, por ejemplo, para comparar la rama actual contra la nueva rama (nombre_de_la_cursión):

git diff branch_name 
Cuestiones relacionadas