¿Git adelante / atrás información entre maestro y rama?

201

He creado una rama para probar en mi repositorio local ( test-branch) al que presioné Github.

Si voy a mi Githubcuenta y selecciono esto test-branch, muestra la información:

This branch is 1 commit ahead and 2 commits behind master

Mis preguntas son:

  1. ¿Cómo puedo mostrar esta información localmente (es decir, un comando que muestra esto en la terminal, en lugar de tener que abrir Githubpara verla)?
  2. Sé que puedo ver las diferencias entre ramas usando:

    git diff master..test-branch
    

    o usando Meld(que prefiero):

    git difftool master..test-branch
    

    pero me preguntaba si hay una manera de ver los compromisos por delante y por detrás por separado. IE: ¿hay alguna manera de mostrar que 1 se compromete por sí solo y luego esos 2 se comprometen por sí mismos?

Gabriel
fuente
1
Se presentará Git 2.5+ (Q2 2015) git for-each-ref --format="%(push:track)" refs/heads. Vea mi respuesta a continuación
VonC
1
Debido a que no pude encontrar esta pregunta usando las palabras clave que estoy a punto de escribir, solo quiero señalar que esto equivale a tomar el complemento relativo (o "diferencia de conjunto") entre los conjuntos de confirmaciones que conforman esas ramas (y luego contando los elementos). Esperemos que esto se convierta en índices de motores de búsqueda.
pmos

Respuestas:

309

Aquí hay un truco que encontré para comparar dos ramas y mostrar cuántas confirmaciones cada rama está por delante de la otra (una respuesta más general sobre su pregunta 1):

Para sucursales locales : git rev-list --left-right --count master...test-branch

Para control remoto sucursales : git rev-list --left-right --count origin/master...origin/test-branch

Esto da una salida como la siguiente:

1 7

Este resultado significa: "En comparación con master, test-branchhay 7 confirmaciones por delante y 1 confirmación por detrás".

También puede comparar sucursales locales con sucursales remotas, por ejemplo, origin/master...masterpara averiguar cuántas confirmaciones tiene la mastersucursal local por delante / detrás de su contraparte remota.

usuario1834095
fuente
1
Esta es una gran solución para mí para averiguar si puedo eliminar una rama o si todavía está por delante del desarrollo.
Maverick1st
1
@ Maverick1st, sí, este comando es particularmente útil cuando está siguiendo el flujo de trabajo de gitflow (que yo soy)
user1834095
2
Este es el mejor caso de uso para encontrar si su rama de característica actual está detrás de master remoto ( git rev-list --left-right --count origin/master...@), siempre que el usuario lo haga git fetchantes; útil para evitar solicitudes de extracción de ramas desactualizadas.
jakub.g
9
Para verificar cuántos commits hay detrás de la rama actual:git rev-list --left-right --count origin/master...@ | cut -f1
jakub.g
8
@ jakub.g no necesita cortar si usa --left-onlyo--right-only
jasonkarns
39

En primer lugar, para ver cuántas revisiones está respaldando localmente, debe hacer una git fetchpara asegurarse de tener la información más reciente desde su control remoto.

El resultado predeterminado de git statusle indica cuántas revisiones está adelante o atrás, pero generalmente encuentro esto demasiado detallado:

$ git status
# On branch master
# Your branch and 'origin/master' have diverged,
# and have 2 and 1 different commit each, respectively.
#
nothing to commit (working directory clean)

Yo prefiero git status -sb:

$ git status -sb
## master...origin/master [ahead 2, behind 1]

De hecho, alias esto simplemente git s, y este es el comando principal que uso para verificar el estado.

Para ver la diferencia en las "revisiones futuras" de master, puedo excluir las "revisiones posteriores" deorigin/master :

git diff master..origin/master^

Para ver la diferencia en las "revisiones posteriores" de origin/master, puedo excluir las "revisiones anticipadas" de master:

git diff origin/master..master^^

Si hay 5 revisiones adelante o atrás, podría ser más fácil escribir así:

git diff master..origin/master~5
git diff origin/master..master~5

ACTUALIZAR

Para ver las revisiones adelante / atrás, la rama debe estar configurada para rastrear otra rama. Para mí, este es el comportamiento predeterminado cuando clono un repositorio remoto y después de presionar una rama con git push -u remotename branchname. Mi versión es 1.8.4.3, pero he estado funcionando así desde que tengo memoria.

A partir de la versión 1.8, puede configurar la rama de seguimiento de esta manera:

git branch --track test-branch

A partir de la versión 1.7, la sintaxis era diferente:

git branch --set-upstream test-branch
janos
fuente
¿Qué versión de gitestás usando? No puedo reproducir lo que obtienes con git statusni con git status -sb. Si intento cualquiera de los comandos (después de hacerlo git fetch) no obtengo ninguna información sobre commits adelante / atrás.
Gabriel
8
Su forma de ver las confirmaciones por delante y por detrás se aplica a mastery origin/mastery quiero ver esas diferencias para mastery otra rama test-branch. ¿Podría reformatear su respuesta para resolver este problema?
Gabriel
La diferencia en las revisiones "detrás" y "adelante" solo funciona para mí si uso 3 puntos entre los nombres de las ramas (no 2). Y el ^ y ^^ no parecían importar aquí Por ejemplo: git diff master ... origin / master git diff origin / master ... master De todos modos, "git status -sb" fue muy útil.
Vituel
10

Con Git 2.5+, ahora tiene otra opción para ver adelante / atrás para todas las ramas que están configuradas para empujar a una rama.

git for-each-ref --format="%(push:track)" refs/heads

Ver más en " Visualización de confirmaciones de Git sin empujar "

VonC
fuente
¿Podría hacer esto solo para la rama actual y su rama de seguimiento remoto?
spex
@spex sí: completo refs/headscon el nombre de la rama actual ( stackoverflow.com/a/12142066/6309 ):refs/heads/$(git rev-parse --abbrev-ref HEAD)
VonC
3

También puedes usar awkpara hacerlo un poco más bonito:

git rev-list --left-right --count  origin/develop...feature-branch | awk '{print "Behind "$1" - Ahead "$2""}'

Incluso puede crear un alias que siempre obtenga el origen primero y luego compare las ramas

commit-diff = !"git fetch &> /dev/null && git rev-list --left-right --count"
Antonis
fuente
1

Después de realizar una búsqueda de git, puede ejecutar el estado de git para mostrar cuántas confirmaciones tiene la rama local delante o detrás de la versión remota de la rama.

Sin embargo, esto no le mostrará cuántos commits tiene delante o detrás de una rama diferente. Sus opciones son la diferencia completa, mirar github o usar una solución como Vimhsa vinculada anteriormente: estado de Git sobre todos los repositorios

Wade Williams
fuente