¿Cómo ver qué twigs de git están rastreando qué twig remota / ascendente?

Sé que puedo hacer git branch --all y eso me muestra twigs locales y remotas, pero no es tan útil para mostrarme las relaciones entre ellos.

¿Cómo enumero las twigs de una manera que muestra qué twig local está rastreando qué control remoto?

Es un comando de porcelana, no es bueno si quieres esto para scripting:

 git branch -vv # doubly verbose! 

Tenga en cuenta que con git 1.8.3, esa twig ascendente se muestra en azul (consulte ” ¿Qué es este seguimiento de bifurcación (si hay algo) en git? “)


Si quieres una salida limpia, mira la respuesta de arcresu : usa un comando de porcelana que no creo que existiera en el momento en que originalmente escribí esta respuesta, por lo que es un poco más conciso y funciona con twigs configuradas para rebase, no solo para fusionar.

git remote show origin

Reemplaza el ‘origen’ con el nombre de tu control remoto.

Una alternativa a la respuesta de kubi es echar un vistazo al archivo .git/config que muestra la configuración del repository local:

cat .git/config

Si miras la página man para git-rev-parse , verás que se describe la siguiente syntax:

@{upstream} , por ejemplo, master@{upstream} , @{u}

El sufijo @{upstream} a un nombre de twig (forma abreviada @{u} ) se refiere a la twig sobre la que se establece la twig especificada por branchname para construir encima. Un nombre de twig faltante está predeterminado al actual.

Por lo tanto, para encontrar el flujo ascendente del master twig, harías:

 git rev-parse --abbrev-ref master@{upstream} # => origin/master 

Para imprimir la información de cada sucursal, podría hacer algo como:

 while read branch; do upstream=$(git rev-parse --abbrev-ref $branch@{upstream} 2>/dev/null) if [[ $? == 0 ]]; then echo $branch tracks $upstream else echo $branch has no upstream configured fi done < <(git for-each-ref --format='%(refname:short)' refs/heads/*) # Output: # master tracks origin/master # ... 

Esto es más limpio que analizar referencias y configuraciones manualmente.

Para la sucursal actual , aquí hay dos buenas opciones:

 % git rev-parse --abbrev-ref --symbolic-full-name @{u} origin/mainline 

o

 % git for-each-ref --format='%(upstream:short)' $(git symbolic-ref -q HEAD) origin/mainline 

Esa respuesta también está aquí , a una pregunta ligeramente diferente que (incorrectamente) se marcó como un duplicado.

 git for-each-ref --format='%(refname:short) < - %(upstream:short)' refs/heads 

mostrará una línea para cada twig local. Una twig de seguimiento se verá así:

 master < - origin/master 

Un sin seguimiento se verá así:

 test < - 

Para la sucursal actual, también puede decir git checkout (sin ninguna sucursal). Este es un no-operativo con efectos secundarios para mostrar la información de seguimiento, si existe, para la twig actual.

 $ git checkout Your branch is up-to-date with 'origin/master'. 

Yo uso este alias

 git config --global alias.track '!f() { ([ $# -eq 2 ] && ( echo "Setting tracking for branch " $1 " -> " $2;git branch --set-upstream $1 $2; ) || ( git for-each-ref --format="local: %(refname:short) < --sync--> remote: %(upstream:short)" refs/heads && echo --Remotes && git remote -v)); }; f' 

entonces

 git track 

Basado en la respuesta de Olivier Refalo

 if [ $# -eq 2 ] then echo "Setting tracking for branch " $1 " -> " $2 git branch --set-upstream $1 $2 else echo "-- Local --" git for-each-ref --shell --format="[ %(upstream:short) != '' ] && echo -e '\t%(refname:short) < --> %(upstream:short)'" refs/heads | sh echo "-- Remote --" REMOTES=$(git remote -v) if [ "$REMOTES" != '' ] then echo $REMOTES fi fi 

Muestra solo local con la pista configurada.

Escríbelo en un script llamado git-track en tu camino y obtendrás un comando git track

Una versión más elaborada en https://github.com/albfan/git-showupstream

git config --get-regexp "branch\.$current_branch\.remote"

le dará el nombre del control remoto que se está rastreando

git config --get-regexp "branch\.$current_branch\.merge"

le dará el nombre de la sucursal remota que se está rastreando.

Deberá reemplazar $ current_branch con el nombre de su sucursal actual. Puedes obtenerlo dinámicamente con git rev-parse --abbrev-ref HEAD

El siguiente mini guión combina esas cosas. Mételo en un archivo llamado git-tracking , hazlo ejecutable y asegúrate de que esté en tu camino.

entonces puedes decir

 $ git tracking ->/ 

tenga en cuenta que el nombre de la sucursal remota puede ser diferente de su nombre de sucursal local (aunque generalmente no lo es). Por ejemplo:

 $git tracking xxx_xls_xslx_thing -> origin/totally_bogus 

como puede ver en el código, la clave para esto es extraer los datos de la configuración de git. Solo uso sed para borrar los datos extraños.

 #!/bin/sh current_branch=$(git rev-parse --abbrev-ref HEAD) remote=$(git config --get-regexp "branch\.$current_branch\.remote" | sed -e "s/^.* //") remote_branch=$(git config --get-regexp "branch\.$current_branch\.merge" | \ sed -e "s/^.* //" -e "s/refs\/.*\///") echo "$current_branch -> $remote/$remote_branch"