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


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".


231
2017-08-27 01:04


origen


Corríjame si me equivoco, sin embargo, ¿no es una rama remota que se denomina origen por defecto en lugar del servidor? - Chris Halcrow


Respuestas:


Usando el ejemplo de mi copia de Puppet extraída del repositorio Git ascendente 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 volver a ejecutar el git remote show origin Comando de nuevo, veré lo siguiente abajo, 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

197
2017-08-27 03:03



Entonces, ¿esto significa que puedes rastrear todas las sucursales remotas en títere aunque tienes algunas sucursales locales? ¿Qué significan los muchos signos "seguidos" que se ven en el resultado del comando? "rastreado" por cual sucursal local? - PJ.
Las ramas remotas se rastrean en que si haces una git fetch o git pull Las actualizaciones a las sucursales remotas serán rastreadas en su repositorio clonado. Las sucursales locales son solo eso, las sucursales locales de las sucursales remotas y, por lo tanto, las actualizaciones de las sucursales 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 asegurar que rastrea la rama desde la cual 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
@PJ: El término "pista" tiene dos significados distintos en Git. Las líneas “seguidas” en git remote show remote-name Referirse a "Seguimiento de ramas" (instantáneas de ramas desde repositorios remotos). Las líneas de "fusión con" se refieren a sucursales locales que tienen un "Rama aguas arriba" configuración (hecha con el --track/-t opción de rama de git o git checkout y por lo tanto a menudo confundido con "ramas de seguimiento"). - Chris Johnsen
"rama de seguimiento remoto"es la entrada actualizada del glosario para" sucursales de seguimiento "mencionada anteriormente. El documento se actualizó en 8b3f3f84. - ento


Para todas las ramas:

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 en sentido ascendente.


122
2018-02-14 16:02



¡Esta es, con mucho, la respuesta más simple y completa!
En la versión 1.7.7.5 de git, esto me muestra la rama local y el sha-1 al que apunta, pero no muestra la rama remota rastreada ... - mpontillo
Funciona para mí en la versión 1.7.4.1 de git. La segunda 'v' se requiere para mostrar la rama de seguimiento remoto. - Peter Johnson
para reducir la salida git branch -lvv Mostrar solo sucursales locales con upstream puede ser útil - A B
^git branch -vv funciona para mi... - notacouch


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

Si planea usar la información en un contexto automatizado (por ejemplo, una secuencia de comandos) debe usar el nivel inferior ("fontanería") git for-each-ref en lugar.

% 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

los git for-each-ref aprendí 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>.remote y git config branch.<name>.merge (probablemente usando git for-each-ref para construir los comandos para cada nombre de rama local).


52
2017-08-27 03:18



El resultado de sus respuestas es mucho más breve y fácil de seguir, por lo que obtiene la votación al alza :) - CubanX
Para que sea menos conciso, pero proporcione una buena manera de verificar visualmente que los nombres remotos son los mismos que los nombres de las sucursales locales, un git gotcha común: en bash git for-each-ref --format=$'\n'' '' '' '' '' '' ''/%(refname:short);%(upstream:short)' refs/heads | tr ';' $'\n' - hobs


Para una rama particular, puedes usar git rev-parse con el @{u} o @{upstream} sufijo 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 puedes usar el branch@{upstream} sintaxis donde se espera un compromiso.


18
2018-05-01 09:18



+1 Tu respuesta me dio exactamente lo que necesitaba: git rev-parse --symbolic-full-name HEAD contra git rev-parse --symbolic-full-name HEAD@{u}, ¡Gracias! - Tino


Yo uso el siguiente script de shell (llamado git-tracks) para mostrar la rama remota a la que hace seguimiento 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 utilizar el mencionado git for-each-ref, pero encontré el acceso directo algo más simple que filtrar la salida para la rama actual.


10
2018-01-21 14:26



Podría considerar usar "set -e" en la parte superior de la secuencia de comandos. Eso le permitirá eliminar todas las instancias de "|| exit $?" mientras se conserva el mismo comportamiento fallido temprano. - John Whitley
@JohnWhitley: Gracias, he editado mi respuesta. Se acerca de set -e, pero por lo general se adhieren a la comprobación explícita. Pero en este caso, es realmente mejor. - Ingo Karkat
No trabajando para mi en git version 1.9.4. Echos nada :( - Ain


.git/config 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/*

8
2017-10-11 12:59





git branch -vv

muestra exactamente lo que pides. Muestra las sucursales locales junto con la sucursal remota correspondiente que están siguiendo.


5
2018-05-07 07:50





Añade 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:]]//"'

2
2018-03-07 16:48





Necesitaba encontrar la rama remota correspondiente (si corresponde) para cada rama local dentro de un bucle que actuaba en una lista de las sucursales 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").


0
2017-11-23 00:08