¿Cómo saber qué sucursal local está rastreando qué sucursal remota en Git?

234

Me gustaría saber si hay una manera de saber qué sucursal local está rastreando qué sucursal remota en Git.

Estoy usando un servidor remoto, que se llama "origen".

PJ.
fuente
Corríjame si me equivoco, pero ¿no es una rama remota que se denomina origen por defecto en lugar del servidor?
Chris Halcrow

Respuestas:

196

Usando el ejemplo de mi copia de Puppet desprotegida del repositorio Git aguas arriba en Github.com ...

$ git remote show origin
* remote origin
  Fetch URL: git://github.com/reductivelabs/puppet.git
  Push  URL: git://github.com/reductivelabs/puppet.git
  HEAD branch: master
  Remote branches:
    0.24.x                 tracked
    0.25.x                 tracked
    2.6.x                  tracked
    master                 tracked
    next                   tracked
    primordial-ooze        tracked
    reins-on-a-horse       tracked
    testing                tracked
    testing-17-march       tracked
    testing-18-march       tracked
    testing-2-april        tracked
    testing-2-april-midday tracked
    testing-20-march       tracked
    testing-21-march       tracked
    testing-24-march       tracked
    testing-26-march       tracked
    testing-29-march       tracked
    testing-31-march       tracked
    testing-5-april        tracked
    testing-9-april        tracked
    testing4268            tracked
  Local branch configured for 'git pull':
    master merges with remote master
  Local ref configured for 'git push':
    master pushes to master (up to date)

Entonces, si tuviera que ejecutar lo siguiente:

$ git checkout -b local_2.6 -t origin/2.6.x 
Branch local_2.6 set up to track remote branch 2.6.x from origin.
Switched to a new branch 'local_2.6'

Y finalmente vuelva a ejecutar el git remote show origincomando nuevamente, veré lo siguiente cerca de la parte inferior:

  Local branches configured for 'git pull':
    local_2.6 merges with remote 2.6.x
    master    merges with remote master
Jeremy Bouse
fuente
1
Entonces, esto significa que puede rastrear todas las ramas remotas en Puppet, aunque tiene algunas ramas locales. ¿Qué significan los muchos signos de "seguimiento" que ves en el resultado del comando? "rastreado" por qué sucursal local?
PJ.
Las ramas remotas se realiza un seguimiento en el que si lo hace una git fetcho git pullcambios a las sucursales remotas se rastreó en su repositorio clonado. Las ramas locales son solo eso, las ramas locales de las ramas remotas y, por lo tanto, las actualizaciones de las ramas remotas se rastrearán y fusionarán cuando se dé el comando apropiado para hacerlo. Incluyo explícitamente la opción '-t' al hacer la rama local para asegurarme de que rastrea la rama desde la que se originó. Recuerde que una sucursal local también puede rastrear otra sucursal local, por lo que no tiene que ser una sucursal remota.
Jeremy Bouse
55
@PJ: El término "seguimiento" tiene dos significados distintos en Git. Las líneas "rastreadas" se git remote show remote-namerefieren a "rastrear ramas" (instantáneas de ramas de repositorios remotos). Las líneas de "fusión con" se refieren a las sucursales locales que tienen una configuración de "rama ascendente" (hecha con la opción --track/ -tde git branch o git checkout y, por lo tanto, a menudo se confunde con "ramas de seguimiento").
Chris Johnsen
" rama de seguimiento remoto " es la entrada actualizada del glosario para las "ramas de seguimiento" mencionadas anteriormente. El documento se actualizó en 8b3f3f84 .
ento
124

Para todas las sucursales:

git branch -avv

Solo para sucursales locales:

git branch -lvv

Solo para sucursales remotas:

git branch -rvv

muestra todas las ramas, así como el nombre de la rama ascendente.

sunew
fuente
2
¡Esta es, con mucho, la respuesta más simple y completa!
66
En la versión 1.7.7.5 git esto me está mostrando la rama local y el SHA-1 que hace referencia, pero no muestra la rama remota rastreado ...
mpontillo
Funciona para mí en git versión 1.7.4.1 La segunda 'v' es necesaria para mostrar la rama de seguimiento remoto.
Peter Johnson el
44
para reducir la producción, git branch -lvvmostrar solo sucursales locales con upstream podría ser útil
AB
55
^ git branch -vvfunciona para mí ...
notacouch
52

Jeremy Bouse ilustra cómo git remote showmuestra la información de seguimiento . Eso debería ser suficiente si solo desea la información para el consumo humano.

Si planea usar la información en un contexto automatizado (por ejemplo, un script), debe usar el nivel inferior ("plomería") en su git for-each-reflugar.

% git remote show origin
* remote origin
⋮
  Local branches configured for 'git pull':
    master merges with remote master
    pu     merges with remote pu
⋮
% git for-each-ref --format='%(refname:short) <- %(upstream:short)' refs/heads
master <- origin/master
pu <- origin/pu

El git for-each-refaprendieron el %(upstream)token en Git 1.6.3 . Con versiones anteriores de Git, tendrá que extraer la información de seguimiento con git config branch.<name>.remotey git config branch.<name>.merge(probablemente usando git for-each-refpara construir los comandos para cada nombre de sucursal local).

Chris Johnsen
fuente
La salida de sus respuestas es mucho más sucinta y fácil de seguir, por lo que obtiene el voto
positivo
Para hacerlo menos conciso, pero proporciona una buena manera de verificar visualmente que los nombres remotos son los mismos que los nombres de las sucursales locales, un problema común: en bashgit for-each-ref --format=$'\n'' '' '' '' '' '' ''/%(refname:short);%(upstream:short)' refs/heads | tr ';' $'\n'
hobs
19

Para una rama en particular, puede usar git rev-parsecon el sufijo @{u}o @{upstream}en el nombre de la rama, por ejemplo:

$  git rev-parse --symbolic-full-name master@{u}
refs/remotes/github-mhl/master

... o para la forma abreviada, agregue --abbrev-ref

$ git rev-parse --symbolic-full-name --abbrev-ref master@{u}
github-mhl/master

Generalmente puede usar la branch@{upstream}sintaxis donde se espera una confirmación.

Mark Longair
fuente
1
+1 Tu respuesta me dio exactamente lo que necesitaba: git rev-parse --symbolic-full-name HEADvs. git rev-parse --symbolic-full-name HEAD@{u}¡gracias!
Tino
10

Utilizo el siguiente script de shell (llamado git-tracks) para mostrar la rama remota que es rastreada por la rama actual:

#!/bin/sh -e
branch=$(git symbolic-ref HEAD)
branch=${branch##refs/heads/}
remote=$(git config "branch.${branch}.remote")
remoteBranch=$(git config "branch.${branch}.merge")
remoteBranch=${remoteBranch##refs/heads/}

echo "${remote:?}/${remoteBranch:?}"

Esto también podría usar lo mencionado git for-each-ref, pero el acceso directo me pareció algo más simple que filtrar la salida de la rama actual.

Ingo Karkat
fuente
Puede considerar usar "set -e" en la parte superior del script. Eso le permitirá eliminar todas las instancias de "|| exit $?" mientras se mantiene el mismo comportamiento de falla temprana.
John Whitley
@ JohnWhitley: Gracias, he editado mi respuesta. Lo sé set -e, pero generalmente me quedo con la comprobación explícita. Pero en este caso, es realmente mejor.
Ingo Karkat
No funciona para mí git version 1.9.4. Echos nada :(
Ain
8

.git/config el archivo también proporcionará la información de la rama de seguimiento como

[remote "Hub"]
    url = ssh://xxxx/tmp/Hub
    fetch = +refs/heads/*:refs/remotes/Hub/*
[branch "develop"]
    remote = Hub
    merge = refs/heads/develop
[branch "Dev1"]
    remote = Test
    merge = refs/heads/Dev1
[remote "Test"]
    url = ssh://xxxx/tmp/gittesting/Dev1GIT
    fetch = +refs/heads/*:refs/remotes/Test/*
Karthik
fuente
5
git branch -vv

muestra exactamente lo que pides. Muestra las ramas locales junto con la rama remota correspondiente que están rastreando.

Jarl
fuente
2

Agregue estas runas a la [alias]sección de su archivo .gitconfig:

show-tracking = !sh -c 'git ls-remote . |grep `git log -1 --grep="git-svn-id" --format=%H`|perl -pe "s/[[:alnum:]]+[[:space:]]//"'
DaveR
fuente
0

Necesitaba encontrar la rama remota correspondiente (si la hubiera) para cada rama local dentro de un bucle que actuaba en una lista de las ramas locales. Terminé usando lo siguiente:

git for-each-ref --format='%(refname:short):%(upstream:short)' refs/heads | grep "^LocalBranchName:.*/" | sed "s/^LocalBranchName://"

Esto no generará nada (una cadena vacía) para las ramas locales que no tienen una rama remota correspondiente ("someremote / somebranch").

Ville
fuente
-1

Probar git branch con opciones :

 -r
List or delete (if used with -d) the remote-tracking branches. 

-a
List both remote-tracking branches and local branches. 

De lo contrario, examine su .git/config.

Andrés
fuente
3
Muestran ramas, pero no entiendo cuál está rastreando cuál.
PJ.