Git: ¿Cómo comprobar si un repositorio local está actualizado?

85

Me gustaría saber si mi repositorio local está actualizado (y si no, idealmente, me gustaría ver los cambios).

¿Cómo podría comprobar esto sin hacer git fetcho git pull?

Misha Moroshko
fuente

Respuestas:

94

Prueba git fetch --dry-run El manual ( git help fetch) dice:

--dry-run
Show what would be done, without making any changes.
Philip Oakley
fuente
3
¡Gracias! Sin embargo, es difícil entender a partir de la salida qué archivos se agregaron / modificaron / eliminaron.
Misha Moroshko
1
Puede ver qué etiquetas se actualizan y el rango de confirmación inicial y final para las distintas ramas. Si esto no es suficiente, hágalo como una recuperación adecuada (no extracción) que le proporcionará una copia local, separada y adecuada del control remoto, sin afectar su propio trabajo de sucursal. Un tirón intentaría fusionar los dos, que no es lo que quieres. La transferencia de datos es la misma, ya sea que se seque o no.
Philip Oakley
4
¿Por qué cuando corro git fetch --dry-runno aparece nada?
Paramvir Singh Karwal
3
@ParamvirSinghKarwal Git es escaso en lo que informa. Si no hay nada que decir, no dice nada, como si no hubiera pasado nada. Tal vez esté actualizado para la especificación de referencia de su búsqueda regular. ¿Quizás agregar --all?
Philip Oakley
1
@AaronBeall Si ese es el caso, lo más probable es que signifique que ya ha obtenido esos cambios localmente (por lo que no hay nada que recuperar), pero aún no los ha combinado con su rama. git pulles aproximadamente equivalente a a git fetch && git merge. Si en algún momento ejecutó la recuperación sin el --dry-run, entonces ya ha obtenido las cosas localmente.
DuckPuppy
34
git remote show origin

Resultado:

HEAD branch: master
  Remote branch:
    master tracked
  Local branch configured for 'git pull':
    master merges with remote master
  Local ref configured for 'git push':
    master pushes to master (local out of date) <-------
Jim Smith
fuente
Eso enumera las ramas de todos los tiempos. Si tiene un repositorio con un historial extenso, la salida está bastante desordenada.
Paulo Carvalho
origen de la demostración remota de git | grep "tu / rama"
jim smith
26

Primer uso git remote update, para actualizar sus referencias remotas. Entonces puede hacer una de varias cosas, como:

  1. git status -unole dirá si la rama que está siguiendo está adelante, atrás o se ha desviado. Si no dice nada, el local y el remoto son lo mismo. Resultado de la muestra:

En la rama DEV

Su rama está detrás de 'origin / DEV' por 7 confirmaciones y se puede reenviar rápidamente.

(use "git pull" para actualizar su sucursal local)

  1. git show-branch *master le mostrará las confirmaciones en todas las ramas cuyos nombres terminan en 'maestro' (por ejemplo, maestro y origen / maestro).

Si usa -vcon git remote update ( git remote -v update), puede ver qué ramas se actualizaron, por lo que realmente no necesita más comandos.

Piyush Agarwal
fuente
2
¿Por qué esto está tan abajo? git remote update ; git status -unoresuelto. git fetch --dry-runno dio salida incluso en los casos en que el local estaba detrás del remoto.
Aaron Beall
1
git remote -v updatees la respuesta para mi.
Paulo Carvalho
17

puede usar git status -unopara verificar si su sucursal local está actualizada con la de origen.

Flowdee
fuente
18
Solo da el estado local, no verifica con la sucursal remota.
Ishan Liyanage
4
Solo da local, ¡pero git remote update ; git status -unohizo el truco! No git fetch --dry-rundio salida cuando lo esperaba (y git pullsacaría cosas).
Aaron Beall
1
Esta respuesta es incorrecta y debe eliminarse. Tal como está, perpetúa un mito muy común pero erróneo sobre cómo funciona Git, uno que solo se disipa cuando / si alguien decide leer los comentarios.
Prometheus
8

La verdad es que no, pero no veo cómo git fetchperjudicaría, ya que no cambiará ninguna de sus sucursales locales.

Niclas Kirschmeier
fuente
Estoy completamente de acuerdo con esto. Git pull puede ser dañino y sobrescribir archivos. Pero git fetch extrae solo los metadatos, lo que permite que comandos como git status le indiquen si su repositorio local está actualizado o no sin sobrescribir ningún archivo. Puede que no responda a la letra de la pregunta, pero responde al espíritu de la pregunta, brindándole la herramienta que desea. Git fetch, luego git status le dirá dónde está su repositorio local en relación con el remoto sin sobrescribir los archivos.
merlit64
5

¡Otra alternativa es ver el estado de la rama remota usando git show-branch remote/branchpara usarla como una comparación que podría ver git show-branch *branchpara ver la rama en todos los controles remotos, así como en su repositorio! consulte esta respuesta para obtener más https://stackoverflow.com/a/3278427/2711378

Amanuel Nega
fuente
5

Deberá emitir dos comandos:

  1. origen de git fetch
  2. estado de git
usuario3695833
fuente
1
Esto funciona, pero la pregunta dice claramente sin 'buscar'. Hay muchos casos en los que desea saber en qué se diferencia su repositorio local del repositorio remoto sin obtener o fusionar los cambios.
pedram bashiri
1
@pedrambashiri Tengo mucha curiosidad, ¿cómo qué? Que yo sepa, una búsqueda por sí sola nunca puede dañar nada.
Prometeo
@Prometheus Lo primero, solo quería señalar que cuando una pregunta dice claramente 'sin buscar', simplemente no puede usar buscar en su respuesta, si no hay otra forma de hacerlo, o no hay un caso real para hacerlo sin, eso necesita para ser explicado en la respuesta. Pero para responder a su pregunta, una búsqueda actualiza su copia local del repositorio remoto. Mire el diagrama en esta publicación blog.osteele.com/2008/05/my-git-workflow
pedram bashiri
4

Debes correr git fetch antes de poder comparar su repositorio local con los archivos de su servidor remoto.

Este comando solo actualiza sus ramas de seguimiento remoto y no afectará su árbol de trabajo hasta que llame git mergeogit pull .

Para ver la diferencia entre su sucursal local y su sucursal de seguimiento remoto una vez que haya obtenido, puede usar git diff o git cherry como se explica aquí.

braitsch
fuente
2

Si utiliza

git fetch --dry-run -v <link/to/remote/git/repo>

recibirá comentarios sobre si está actualizado. Entonces, básicamente, solo necesita agregar la opción "verbosa" a la respuesta dada anteriormente.

Don Davis
fuente
1

Esto es imposible sin usar git fetcho git pull. ¿Cómo puede saber si el repositorio está "actualizado" sin tener que ir al repositorio remoto para ver qué significa "actualizado"?

Jörg W Mittag
fuente
5
¡Por favor confirme eso! ¡Acabas de responder lo que piensas! ¡Debes tener más cuidado ya que los novatos se caerán con él!
Amanuel Nega
4
@AmanuelNega: Esto es solo lógica básica. Si desea saber si su repositorio local está en el mismo estado que el repositorio remoto, necesita conocer el estado del repositorio remoto. Período. Si no conoce el estado del repositorio remoto, no es posible que sepa si el repositorio local está en el mismo estado. Tenga en cuenta que la respuesta más votada y aceptada utiliza git pull, que el OP prohíbe explícitamente en su pregunta.
Jörg W Mittag
2
¡Ser informado! git status -unoesto funciona y también se puede usar git show-branch *masterpara ver el estado de todas las ramas maestras. ¿Sigues diciendo que es imposible? ¡Puede ver el estado de cualquier sucursal siempre que tenga acceso al control remoto!
Amanuel Nega
2
@AmanuelNega: git statussolo le dice el estado de sus referencias locales, no le dice si sus referencias locales están al día con las referencias remotas. Nuevamente: es simplemente lógicamente imposible saber cuál es el estado del repositorio remoto sin obtener el estado del repositorio remoto. Período. Estas son solo las leyes básicas del espacio-tiempo.
Jörg W Mittag
6
No es "lógicamente" imposible ya que evidentemente uno podría llamar a alguien en su sala de servidores y decir, "¿cuál es el hash de su HEAD en la rama maestra?" no tengo ese hash. Ahora sabes que no están sincronizados.
James Robinson
1

Traté de formatear mi respuesta, pero no pude. Por favor, apile el equipo de overflow, por qué publicar la respuesta es tan difícil.

sin embargo,

respuesta:
git fetch origin
git status (verá un resultado como "Su rama está detrás de 'origin / master' por 9 confirmaciones")
para actualizar a cambios remotos: git pull

adarsh
fuente