Usando Git, ¿cómo encuentro cambios entre local y remoto?
Pregunta
Aquí hay dos preguntas diferentes, pero creo que están relacionadas.
-
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
. -
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?
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
-
Use " git log origin..HEAD "
-
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.