2011-02-09 22 views
38

Quiero verificar la diferencia real entre la sucursal remota y la sucursal local. ¿Cómo puedo hacer eso?¿Cómo verificar la diferencia real de git antes de fusionarse desde una sucursal remota?

La emisión del siguiente comando funciona parcialmente, pero también muestra la diferencia de los nuevos cambios de mi sucursal local.

git diff remote/branch 
+0

No entiendo la pregunta. La diferencia muestra la diferencia entre las ramas, ¿por qué crees que no se fusionarán? – Abizern

+0

@Abizern mi mal! Corregí la pregunta. ¡Gracias! :) – abhiomkar

+0

posible duplicado de [comparar la rama local de git con la sucursal remota?] (Http://stackoverflow.com/questions/1800783/compare-local-git-branch-with-remote-branch) –

Respuesta

12

Desde el documentation:

git diff [--options] <commit>...<commit> [--] [<path>…] 

Esta forma es para ver los cambios en la rama que contiene y hasta el segundo <commit>, a partir de un ancestro común de ambos <commit>. "git diff A ... B" es equivalente a "git diff $ (git-merge-base A B) B". Puede omitir cualquiera de <commit>, que tiene el mismo efecto que usar HEAD en el .

¿Has probado esto?

+0

¡Gracias! No me di cuenta de que tres puntos funcionan para esto. ¡Funciona! :) – abhiomkar

7

Lo que se quiere hacer es, como sugiere Evgen Bodunov:

git diff ...remote/branch 

Esto diff cambios con respecto a la rama remota/e ignorar los cambios de la cabeza actual.

97

Dado que este tema aparece con frecuencia, y puede ser confuso sin tener un poco de experiencia sobre cómo funciona el git, pensé en intentar explicar el caso más simple posible, pero con suficiente profundidad para que los recién llegados tengan suficiente en él para hacer investigación adicional.

Si configura su repositorio de git a través de un 'clon' normal y tiene las referencias por defecto, lo que significa que su control remoto se llama 'origen' y lo extrae de la rama 'maestro', a veces necesita ver qué hay en el repositorio remoto antes de tirarlo hacia abajo.

Dado que el "git pull" realiza una fusión automática (a menos que haya conflictos), puede ser agradable ver qué es lo que "entra" a continuación. Si no está familiarizado con el funcionamiento de git, y cómo se administran las referencias específicas, esto puede ser un poco no intuitivo.

Supongamos que alguien hace un cambio en el repositorio remoto (por motivos de ilustración, añadiendo una línea al repositorio remoto al cometer un cambio y empujándolo), y escribe:

$ git diff origin/master 

Probablemente no verá ningún cambio; Sin embargo, si hace lo siguiente:

$ git fetch; git diff ..origin/master 

verá la diferencia entre lo que se ha comprometido a su repositorio Git local y lo que está en el repositorio remoto. NO verá ningún cambio que esté en su sistema de archivos local o en su índice.

Ok, ¿por qué hacemos esto? origin/master es refspec (ver páginas man). En resumen, esto es a lo que nos referimos para comparar, tirar o buscar, y presionar para.Todos los siguientes son funcionalmente equivalentes:

origin/master 
remotes/origin/master 
refs/remotes/origin/master 

para comenzar a desenredar esto, sólo echar un vistazo a la estructura de directorios de su repositorio git. Un diseño típico se ve así:

.git/refs 
.git/refs/heads 
.git/refs/heads/master 
.git/refs/remotes 
.git/refs/remotes/origin 
.git/refs/remotes/origin/HEAD 
.git/refs/remotes/origin/master 
.git/refs/tags 

Mira en .git/refs/remotos/origen/HEAD; en el caso predeterminado, apuntará a la rama que usa para extraer y presionar. En mi caso, ya que soy el maestro, el contenido de este archivo de texto se ven así:

ref: refs/remotes/origin/master 

Esto me dice que la cabeza de mi control remoto se identifica por el refspec 'refs/mandos a distancia/origin/master '(que pasa a tener los alias mencionados anteriormente).

Esto no nos dice mucho; ¿Cuál es el estado del repositorio remoto? Mira el estado de la maestra remota:

$ cat .git/refs/heads/master  
6d0fb0adfdfa5af861931bb06d34100b349f1d63 

Ok, es un hash SHA1; Probablemente un compromiso. ¿Cómo se pone en este archivo? Bueno, cada vez que haces un pull o un fetch, este archivo se actualiza con la confirmación más reciente del control remoto que se extrajo o fue extraído. Esto explica por qué tenemos que git fetch antes de realizar la diferencia. Recuerde, git fetch simplemente actualiza su copia local de una sucursal remota, pero no la combina con su copia de trabajo. Es completamente seguro Un git fetch; git merge es equivalente a git pull.

Una vez que realice la búsqueda, git podrá ver la confirmación más reciente en el repositorio remoto a partir del momento de la recuperación.

Se pueden utilizar varias combinaciones de especificadores a git para ver sus diferenciaciones como desee (los ejemplos siguientes se utiliza la copia de trabajo local como el primer implícita commit):

$ git diff remote/origin 
This shows the incoming remote additions as deletions; any additions in your local 
repository are shown as additions. 

$ git diff ...remote/origin 
Shows incoming remote additions as additions; the triple-dot excludes changes 
committed to your local repository. 

$ git diff ..remote/origin 
Shows incoming remote additions as additions; the double-dot includes changes 
committed to your local repository as deletions (since they are not yet pushed). 

Para información sobre ".." vs "..." ver git help diff, así como la excelente documentación en git-scm revision selection: commit ranges En pocas palabras, para los ejemplos anteriores, la sintaxis de doble punto muestra todas las confirmaciones accesibles desde el origen/maestro pero no su copia de trabajo. Del mismo modo, la sintaxis de triple punto muestra todas las confirmaciones accesibles desde la confirmación (copia de trabajo implícita, remota/origen) pero no desde ambas.

Estoy pasando por este paso por paso porque soy bastante nuevo en git y este es exactamente el tipo de cosa que tenía confundido ... Estoy seguro de que los expertos de Git pueden encontrar defectos con el detalles ... Solo espero que esta respuesta cierre la brecha para algunas personas que encuentran que las diversas publicaciones son un tanto escuetas.

+4

Puntos dobles y triples, ¿eh? Eso es horrible. Pero gracias por tu respuesta, explica por qué el git diff nunca mostró mucho para mí. –

+4

Esa debería ser la respuesta aceptada; es mucho más fácil para principiantes y explica los conceptos importantes en torno a diff (la página de manual es un dolor para comprender correctamente si no estás acostumbrado a todos los términos). – mark

+0

No entiendo la última parte. "Muestra los cambios remotos entrantes como adiciones"? Entonces, ya sea que los cambios entrantes sean adiciones o eliminaciones, ¿se muestran como adiciones? No lo creoLa respuesta [aquí] (http://stackoverflow.com/questions/7251477/git-diff-whats-the-difference-between-having-and-no-dots) también parece bastante diferente. – Cerran

Cuestiones relacionadas