Pregunta

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

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

  2. Cuando uso Git, ¿cómo encuentro qué cambios tiene una rama remota antes de hacer un pull? Estoy buscando algo similar al comando Mercurial hg entrante .

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

¿Fue útil?

Solución

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

Entonces, si tienes una rama llamada master y un control remoto llamado origin , después de ejecutar git fetch , también deberías tener una rama llamado origin / master . Luego puede obtener el git log de todas las confirmaciones que master debe ser un superconjunto de origin / master haciendo git log master ..origin / master . Invierte esos dos para obtener lo contrario.

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

Otros consejos

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 hg entrante :

git log ..@{u}

Para imitar hg saliente :

git log @{u}..

Uso los siguientes alias entrante y saliente para hacer que los anteriores sean más fáciles de usar:

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

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

git diff master origin/master

  1. Use " git log origin..HEAD "

  2. Usa " git fetch " seguido de " git log HEAD..origin " ;. Puede seleccionar las confirmaciones individuales utilizando los ID de confirmación que se enumeran.

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).

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

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

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

  

Muestra todos los commits que están en cualquiera de   sucursales locales pero no en ninguno de   ramas de seguimiento remoto para el origen   (lo que tiene ese origen no hace & # 8217; t).

Lo anterior es para saliente . Para entrante , simplemente intercambie:

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

Lo haría

$ git fetch --dry-run

para hg entrante y

$ git push --dry-run

para hg saliente .

git-out es un script que emula hg saliente con bastante precisión. Se analiza en " push -n " salida, por lo que produce una salida precisa si necesita especificar argumentos adicionales para empujar.

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

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

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

Luego puedes usar 5905..4878 como argumentos para varios otros 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

Cuando realiza 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 utiliza el sufijo -a con git fetch, 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 fusionarlos si lo hace o puede simplemente seleccionar cherry si desea solo algunos comentarios de lo que ha sido traído por Fetch.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top