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 sucursal remota? Estoy buscando algo similar al comando Mercurial
hg outgoing
.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 incoming
.
Para el segundo: ¿hay alguna forma de ver lo que está disponible y luego elegir los cambios que quiero obtener?
hg incoming
y quéhg outgoing
hacer realmente. El equivalente de Git más cercano que encontré es la--dry-run
opción. Justogit pull --dry-run
y verás una lista de todas las cosas que deben suceder.Respuestas:
Git no puede enviar ese tipo de información a través de la red, como puede hacer Hg. Pero puede ejecutar
git fetch
(que es más parecidohg pull
ahg fetch
) para obtener nuevas confirmaciones de sus servidores remotos.Entonces, si tiene una rama llamada
master
y una remota llamadaorigin
, después de ejecutargit fetch
, también debe tener una rama llamadaorigin/master
. A continuación, puede obtenergit log
todos los commits quemaster
deben ser un superconjuntoorigin/master
al hacergit log master..origin/master
. Invierta esos dos para obtener lo contrario.Un amigo mío, David Dollar, ha creado un par de scripts de git shell para simular
hg incoming/outgoing
. Puede encontrarlos en http://github.com/ddollar/git-utils .fuente
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 incoming
:Para imitar
hg outgoing
:Uso lo siguiente
incoming
y losoutgoing
alias para hacer que lo anterior sea más fácil de usar:fuente
git branch --set-upstream foo origin/foo
.git log @{u}..
enumera cada cambio en el repositorio para mí. No hay forma de que aún no existan.git rev-parse --symbolic-full-name @{u}
imprimir la referencia remota adecuada. Además,git log @{u}..
muestra las confirmaciones a las que la rama ascendente no puede acceder, que pueden incluir confirmaciones que ya están en el repositorio remoto (si se puede acceder a ellas mediante una referencia diferente). Esto sucederá justo después de fusionarse en una rama ya empujada.checkout <somebranch>
ymerge <otherbranch>
. En este punto, hice ellog @{u}..
y vi todos los cambios enumerados.No es una respuesta completa, pero git fetch extraerá el repositorio remoto y no hará una fusión. Entonces puedes hacer un
fuente
git diff origin/master master
Use "git log origin..HEAD"
Utilice "git fetch" seguido de "git log HEAD..origin". Puede seleccionar confirmaciones individuales utilizando los ID de confirmación enumerados.
Lo anterior supone, por supuesto, que "origen" es el nombre de su rama de seguimiento remoto (que es si ha utilizado clonar con opciones predeterminadas).
fuente
También hay esto, para comparar todas las ramas:
Esto es lo que dice la página de manual de git log sobre esto:
Lo anterior es para
outgoing
. Paraincoming
, simplemente intercambiar:fuente
yo lo haría
para
hg incoming
ypara
hg outgoing
.fuente
git-out es un script que emula con
hg outgoing
bastante precisión. Se analiza en la salida "push -n", por lo que produce una salida precisa si necesita especificar argumentos adicionales para empujar.fuente
git entrante
git saliente
fuente
Cuando las respuestas "git log" 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 master-> master". 5905 es la última confirmación que tiene el control remoto y los compromisos a través de (e incluyendo) 4878 se aplicarán al control remoto.
Luego puede usar 5905..4878 como argumentos para varios otros comandos git para obtener más detalles:
fuente
Cuando hace git fetch, todo el contenido, incluidas las ramas, las etiquetas (referencias) se almacenan temporalmente en .git / FETCH_HEAD cuyo contenido se puede ver con el comando: git log FETCH_HEAD Si no usa el sufijo -a con git fetch, entonces de manera 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 elegir simplemente si desea solo unas pocas confirmaciones de lo que se ha traído por fetch.
fuente