repositorio remota rama origin example eliminar comandos cambiar actualizar git mercurial

remota - Usando Git, ¿cómo puedo encontrar cambios entre locales y remotos?



git push example (10)

git entrante

$ git fetch && git log ..origin/master --stat OR $ git fetch && git log ..origin/master --patch

git saliente

$ git fetch && git log origin/master.. --stat OR $ git fetch && git log origin/master.. --patch

Aquí hay dos preguntas diferentes, pero creo que están relacionadas.

  1. Cuando uso Git, ¿cómo puedo encontrar qué cambios he confirmado localmente, pero aún no he enviado a una rama remota? Estoy buscando algo similar al comando Mercurial hg outgoing .

  2. Cuando uso Git, ¿cómo puedo encontrar qué cambios tiene una rama remota antes de hacer una extracción? Estoy buscando algo similar al comando Mercurial hg incoming .

Para el segundo: ¿hay alguna manera de ver lo que está disponible y luego elegir cuidadosamente los cambios que quiero extraer?


  1. Use "git log origin..HEAD"

  2. Use "git fetch" seguido de "git log HEAD..origin". Puede seleccionar cuidadosamente compromisos individuales utilizando los ID de confirmación listados.

Lo anterior supone, por supuesto, que "origen" es el nombre de su rama de seguimiento remoto (que es si ha usado clonar con opciones predeterminadas).


Comenzando con Git 1.7.0, hay una sintaxis especial que le permite referirse genéricamente a la rama ascendente: @{u} o @{upstream} .

Para imitar a hg incoming :

git log ..@{u}

Para imitar a hg outgoing :

git log @{u}..

Utilizo los siguientes alias incoming y outgoing para hacer que lo anterior sea más fácil de usar:

git config --global alias.incoming ''!git remote update -p; git log ..@{u}'' git config --global alias.outgoing ''log @{u}..''


Cuando haces git fetch, todos los contenidos, incluidas las ramas, las etiquetas (refs) se almacenan temporalmente en .git / FETCH_HEAD cuyo contenido se puede ver con el comando: git log FETCH_HEAD Si no usas el sufijo -a con git fetch, entonces de forma predeterminada , El contenido de FETCH_HEAD se sobrescribirá con nuevos contenidos. A partir de estos contenidos, puede ver y decidir a qué rama desea unirlos si lo hace o puede seleccionarlos fácilmente si solo quiere unos pocos commits de lo que ha sido traído por fetch.


Cuando las respuestas "gitlog" y @ {u} inicialmente me dieron errores de "revisión desconocida", probé la sugerencia de Chris / romkyns de git push --dry-run .

Obtendrá una salida como "5905..4878 maestro-> maestro". 5905 es la última confirmación que el control remoto tiene y se compromete a través de (e incluyendo) 4878 se aplicará al control remoto.

A continuación, puede usar 5905..4878 como argumentos para otros muchos comandos de git para obtener más detalles:

git diff 5905..4878 # Gives full code changes in diff style git log --online 5905..4878 # Displays each commit''s comment


Git no puede enviar ese tipo de información a través de la red, como Hg. Pero puedes ejecutar git fetch (que es más parecido a hg pull que hg fetch ) para obtener nuevas confirmaciones de tus servidores remotos.

Entonces, si tiene una rama llamada master y un origin remoto llamado, después de ejecutar git fetch , también debe tener una rama llamada origin/master . Luego puede obtener el git log de git log de todas las confirmaciones que el master necesita para ser un superconjunto de origin/master haciendo git log master..origin/master . Invierta esos dos para obtener lo opuesto.

Un amigo mío, David Dollar, ha creado un par de guiones de shell git para simular hg incoming/outgoing . Puede encontrarlos en http://github.com/ddollar/git-utils .


No es una respuesta completa, pero git fetch sacará el repositorio remoto y no hará una fusión. Entonces puedes hacer un

git diff master origin/master


También hay esto, para comparar todas las ramas:

git log --branches --not --remotes=origin

Esto es lo que dice la página man de git log sobre esto:

Muestra todas las confirmaciones que se encuentran en cualquiera de las sucursales locales, pero no en ninguna de las sucursales de seguimiento remoto para el origen (lo que tiene ese origen no).

Lo anterior es para outgoing . Para incoming , simplemente intercambie:

git log --remotes=origin --not --branches


yo lo haría

$ git fetch --dry-run

para hg incoming y

$ git push --dry-run

para hg outgoing .


git-out es una secuencia de comandos que emula hg outgoing bastante precisión. Analiza la salida "push-n", por lo que produce resultados precisos si necesita especificar argumentos adicionales para enviar.