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 mí 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.
No entiendo la pregunta. La diferencia muestra la diferencia entre las ramas, ¿por qué crees que no se fusionarán? – Abizern
@Abizern mi mal! Corregí la pregunta. ¡Gracias! :) – abhiomkar
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) –