Averigüe qué sucursal remota está rastreando una sucursal local

844

Ver también:
¿Cómo puedo ver qué ramas de Git están rastreando qué rama remota / aguas arriba?

¿Cómo puedo averiguar qué sucursal remota está rastreando una sucursal local?

¿Necesito analizar la git configsalida o hay un comando que haga esto por mí?

Solo lectura
fuente
18
Sheesh Este no es un duplicado exacto. Este es un subconjunto del otro, pero hay otras formas de hacer la pregunta, como git remote show origin. La respuesta principal en la otra pregunta es un script bash envuelto alrededor de la respuesta simple aquí, que podría ser útil para algunos. Esperemos que esta pregunta no se cierre por completo.
cdunn2001
55
De acuerdo, esto definitivamente no debería ser un engaño. Está haciendo algo completamente diferente a la pregunta vinculada
Adam Batkin

Respuestas:

1005

Aquí hay un comando que le brinda todas las ramas de seguimiento (configuradas para 'pull'), consulte:

$ git branch -vv
  main   aaf02f0 [main/master: ahead 25] Some other commit
* master add0a03 [jdsumsion/master] Some commit

Tiene que pasar por el SHA y cualquier mensaje de confirmación de envoltura larga, pero es rápido de escribir y obtengo las ramas de seguimiento alineadas verticalmente en la tercera columna.

Si necesita información sobre la configuración 'pull' y 'push' por rama, consulte la otra respuesta en git remote show origin.


Actualizar

A partir de la versión 1.8.5 de git, puede mostrar la rama ascendente con git statusygit status -sb

jdsumsion
fuente
66
Esta salida es más directa que git branch -avo git remote show origin, lo que le brinda
MUCHOS
6060
Por cierto, las versiones más recientes de git (1.8.5.x) ahora también muestran la rama ascendente durante git statusy git status -sb, por lo tanto, una vez que actualice a 1.8.5.x, esta pregunta (y respuesta) es irrelevante.
jdsumsion
11
Si bien esto le brinda la información que desea, no estaría de acuerdo ya que es la respuesta correcta. Es una respuesta de la misma manera que darle a alguien un diccionario responde "cómo se deletrea XYZ". En este caso, desea USAR la respuesta resultante (el nombre de la rama) para alguna operación ... Esta respuesta solo me ayuda a verla visualmente ... no le da algo que pueda usar en un comando posterior.
UpAndAdam
El resultado de este comando puede ser engañoso ya que un mensaje de confirmación puede comenzar fácilmente con, por ejemplo, "[mi-característica] ...". Consulte la respuesta de @ cdunn2001 que muestra solo la rama ascendente (si la hay) y nada más.
Jonas Berlin
1
Estoy de acuerdo con @ jonas-berlin - la respuesta de cdunn2001 es mejor si desea analizar el resultado - mi respuesta es buena si está buscando un comando simple y está dispuesto a escanear visualmente la salida
jdsumsion
372

Dos 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
cdunn2001
fuente
12
¡Agradable! El primero da errores feos en caso de que no se rastree nada, mientras que el segundo es especialmente útil para las secuencias de comandos. Por cierto %(refname:short)es el nombre de la referencia actual dentro --format.
Tino
99
git help revisions(una de las partes poco conocidas pero más útiles de los documentos) y busque upstream.
cdunn2001
15
Esta respuesta es mucho mejor que las dos respuestas anteriores, especialmente si quieres hacer algo comogit diff `git rev-parse --abbrev-ref --symbolic-full-name @{upstream}`
Jian
2
Esto es realmente útilecho 'git for-each-ref --format=\'%(refname:short) -> %(upstream:short)\' refs/heads/$1' > ~/bin/git-show-upstream; chmod +x ~/bin/git-show-upstream
albfan
66
Si desea conocer el git for-each-ref --format='%(upstream:short)' $(git rev-parse --symbolic-full-name SOMEBRANCH)flujo ascendente de alguna otra sucursal, una variante de la segunda opción es: reemplazar SOMEBRANCH con el nombre de la sucursal, o "HEAD" para la sucursal actual
Jonas Berlin
220

Creo que git branch -avsolo te dice qué ramas tienes y en qué compromiso están, dejándote inferir qué ramas remotas están rastreando las ramas locales.

git remote show originle dice explícitamente qué ramas están rastreando qué ramas remotas. Aquí hay un ejemplo de salida de un repositorio con un solo commit y una rama remota llamada abranch:

$ git branch -av
* abranch                d875bf4 initial commit
  master                 d875bf4 initial commit
  remotes/origin/HEAD    -> origin/master
  remotes/origin/abranch d875bf4 initial commit
  remotes/origin/master  d875bf4 initial commit

versus

$ git remote show origin
* remote origin
  Fetch URL: /home/ageorge/tmp/d/../exrepo/
  Push  URL: /home/ageorge/tmp/d/../exrepo/
  HEAD branch (remote HEAD is ambiguous, may be one of the following):
    abranch
    master
  Remote branches:
    abranch tracked
    master  tracked
  Local branches configured for 'git pull':
    abranch merges with remote abranch
    master  merges with remote master
  Local refs configured for 'git push':
    abranch pushes to abranch (up to date)
    master  pushes to master  (up to date)
Ajit George
fuente
3
Necesito un comando que descubra la rama ascendente, por lo que usar 'origen' como entrada es una suposición, por lo que esto no funciona para mí
Alexander Mills el
1
Pero esto responde al OP. El comando le git remote show originmuestra ramas locales y lo que rastrean para empujar y tirar.
dudewad
1
@dudewad Creo que el punto era que este comando supone que se llama al control remoto origin, mientras que en realidad podría ser cualquier cosa (por ejemplo, controles remotos múltiples, con diferentes ramas que rastrean ramas de diferentes controles remotos).
Ruslan
74

Actualización: Bueno, ¡han pasado varios años desde que publiqué esto! Para mi propósito específico de comparar HEAD con aguas arriba, ahora uso@{u} , que es un atajo que se refiere a HEAD de la rama de seguimiento de aguas arriba. (Ver https://git-scm.com/docs/gitrevisions#gitrevisions-emltbranchnamegtupstreamemegemmasterupstreamememuem ).

Respuesta original: También me he encontrado con este problema. A menudo uso múltiples controles remotos en un solo repositorio, y es fácil olvidar cuál es el seguimiento de su rama actual. Y a veces es útil saber eso, como cuando quieres ver tus confirmaciones locales a través de git log remotename/branchname..HEAD.

Todo esto se almacena en las variables de configuración de git, pero no tiene que analizar la salida de configuración de git. Si invoca git config seguido del nombre de una variable, solo imprimirá el valor de esa variable, no se requiere análisis. Con eso en mente, aquí hay algunos comandos para obtener información sobre la configuración de seguimiento de su sucursal actual:

LOCAL_BRANCH=`git name-rev --name-only HEAD`
TRACKING_BRANCH=`git config branch.$LOCAL_BRANCH.merge`
TRACKING_REMOTE=`git config branch.$LOCAL_BRANCH.remote`
REMOTE_URL=`git config remote.$TRACKING_REMOTE.url`

En mi caso, dado que solo estoy interesado en averiguar el nombre de mi control remoto actual, hago esto:

git config branch.`git name-rev --name-only HEAD`.remote
Aaron Wells
fuente
2
Esto fue muy útil para crear un alias para rebase cualquiera que sea mi rama actual. ¡Gracias!
Justin Spahr-Summers
Igualmente útil para nuestro alias de 'avance rápido' que avanzará la rama de seguimiento local al control remoto siempre que la operación sea un avance rápido.
Altreus
44
En realidad descubrí que esto git name-rev --name-only HEADno te dirá en qué rama estás realmente. Para eso acabo de usargit branch | grep '^\*' | cut -d' ' -f2
Altreus
1
¡Gracias! ¡Otras respuestas a preguntas similares no mencionaron @{u}alias / atajo y eso es exactamente lo que estaba buscando! No hay razón para comparar con la rama maestra si solo desea determinar si necesita tirar o no.
Dan M.
1
@{u}es la bomba Y ha existido desde 1.7.0, lo que significa que si no está disponible en un git que alguien está usando en 2018, probablemente se deba actualizar.
Chris Cleeland
48

Las sucursales locales y sus controles remotos.

git branch -vv 

Todas las ramas y controles remotos de seguimiento.

git branch -a -vv

Vea dónde las ramas locales están configuradas explícitamente para push y pull.

git remote show {remote_name}
nikkypx
fuente
21

Esto le mostrará la rama en la que se encuentra:

$ git branch -vv

Esto mostrará solo la rama actual en la que se encuentra:

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

por ejemplo:

myremote/mybranch

Puede encontrar la URL del control remoto que utiliza la rama actual con la que se encuentra:

$ git remote get-url $(git for-each-ref --format='%(upstream:short)' $(git symbolic-ref -q HEAD)|cut -d/ -f1)

por ejemplo:

https://github.com/someone/somerepo.git
rubo77
fuente
19

Puede usar git checkout, es decir, "verifique la rama actual". Este es un no-op con efectos secundarios para mostrar la información de seguimiento, si existe, para la rama actual.

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

No sé si esto cuenta como analizar la salida de git config, pero esto determinará la URL del control remoto que el maestro está rastreando:

$ git config remote. $ (git config branch.master.remote) .url
William Pursell
fuente
O git config branch.$(git symbolic-ref -q HEAD).remotesi solo desea el nombre del control remoto que se rastrea de la rama actual,git config remote.$(git config branch.$(git symbolic-ref -q HEAD).remote).url para la URL.
Anakhand
Necesitaba agregar una --shortopción para que funcione. Entonces, para obtener el nombre remoto de la rama actual: git config branch.$(git symbolic-ref -q --short HEAD).remotey para obtener la URL del control remoto de la rama actual:git config remote.$(git config branch.$(git symbolic-ref -q --short HEAD).remote).url
Nelson
13

Otra forma

git status -b --porcelain

Esto te dará

## BRANCH(...REMOTE)
modified and untracked files
FragLegs
fuente
10

Otra forma simple es usar

cat .git/config en un repositorio git

Esto enumerará los detalles de las sucursales locales.

Trickmaster
fuente
Funciona bien en Linux. No funcionará en Windows a menos que sea en un indicador similar a Unix (por ejemplo, cygwin o git bash).
Contango
En Windows sólo tiene que utilizar type .git/configen lugar de cat .git/config, por supuesto, en la línea de comandos llanura ..
khmarbaise
9

Otro método (gracias osse), si solo quieres saber si existe o no:

if git rev-parse @{u} > /dev/null 2>&1
then
  printf "has an upstream\n"
else
  printf "has no upstream\n"
fi
Wayne Walker
fuente
¿Que lenguaje? Esto se parece a un script de shell de Linux pero no proporciona otra información o contexto.
Suncat2000
8

git branch -vv | grep 'BRANCH_NAME'

git branch -vv : Esta parte mostrará todas las sucursales locales junto con su sucursal aguas arriba.

grep 'BRANCH_NAME' : Filtrará la rama actual de la lista de ramas.

Sabyasachi Ghosh
fuente
7
git branch -r -vv

enumerará todas las ramas, incluso las remotas.

Ranushka Goonesekere
fuente
5

Enumera sucursales locales y remotas:

$ git branch -ra

Salida:

  feature/feature1
  feature/feature2
  hotfix/hotfix1
* master
  remotes/origin/HEAD -> origin/master
  remotes/origin/develop
  remotes/origin/master
joseluisq
fuente
3

La salida v2 de git-status porcelain (legible por máquina) se ve así:

$ git status -b --porcelain=v2
# branch.oid d0de00da833720abb1cefe7356493d773140b460
# branch.head the-branch-name
# branch.upstream gitlab/the-branch-name
# branch.ab +2 -2

Y para obtener la rama solo aguas arriba:

$ git status -b --porcelain=v2 | grep -m 1 "^# branch.upstream " | cut -d " " -f 3-
gitlab/the-branch-name

Si la rama no tiene flujo ascendente, el comando anterior producirá una salida vacía (o fallará set -o pipefail).

AndiDog
fuente
2

Si desea encontrar el flujo ascendente para cualquier rama (en lugar de solo en la que se encuentra), aquí hay una pequeña modificación a la respuesta de @ cdunn2001:

git rev-parse --abbrev-ref --symbolic-full-name YOUR_LOCAL_BRANCH_NAME@{upstream}

Eso le dará el nombre de la sucursal remota para la sucursal local nombrada YOUR_LOCAL_BRANCH_NAME.

Jeremy Thomerson
fuente
2

Puedes probar esto:

git remote show origin | grep "branch_name"

branch_name necesita ser reemplazado con su sucursal

xpioneer
fuente
¿Qué sucede si el nombre de su sucursal también coincide con otras sucursales? ¿Qué sucede si el nombre de su rama coincide con algún otro texto en la salida de git remote show origin- si se llama mergeso configure?
Tom Swirly
no te entendí ¿te refieres a múltiples ramas con los mismos nombres
xpioneer
1

Yo uso este alias

git config --global alias.track '!sh -c "
if [ \$# -eq 2 ]
 then
   echo \"Setting tracking for branch \" \$1 \" -> \" \$2;
   git branch --set-upstream \$1 \$2;
 else
   git for-each-ref --format=\"local: %(refname:short) <--sync--> remote: %(upstream:short)\" refs/heads && echo --URLs && git remote -v;
fi  
" -'

entonces

git track

tenga en cuenta que el script también se puede usar para configurar el seguimiento.

Más alias geniales en https://github.com/orefalo/bash-profiles

Olivier Refalo
fuente
0

Uso EasyGit (también conocido como "por ejemplo") como una envoltura súper liviana en la parte superior (o al costado de) Git. EasyGit tiene un subcomando de "información" que le brinda todo tipo de información súper útil, incluida la rama de seguimiento remoto de las sucursales actuales. Aquí hay un ejemplo (donde el nombre actual de la sucursal es "foo"):

pknotz @ s883422: (foo) ~ / workspace / bd
$ eg info
Compromisos totales: 175
Repositorio local: .git
Repositorios remotos nombrados: (nombre -> ubicación)
  origen -> git: //sahp7577/home/pknotz/bd.git
Sucursal actual: foo
  Suma de verificación criptográfica (sha1sum): bd248d1de7d759eb48e8b5ff3bfb3bb0eca4c5bf
  Depósito predeterminado de extracción / inserción: origen
  Opciones predeterminadas de extracción / inserción:
    branch.foo.remote = origen
    branch.foo.merge = refs / heads / aal_devel_1
  Número de contribuyentes: 3
  Número de archivos: 28
  Número de directorios: 20
  Tamaño de archivo más grande, en bytes: 32473 (pygooglechart-0.2.0 / COPYING)
  Compromete: 62
Pat Notz
fuente
0

Mejorando esta respuesta , se me ocurrieron estos .gitconfigalias:

branch-name = "symbolic-ref --short HEAD"
branch-remote-fetch = !"branch=$(git branch-name) && git config branch.\"$branch\".remote || echo origin #"
branch-remote-push  = !"branch=$(git branch-name) && git config branch.\"$branch\".pushRemote || git config remote.pushDefault || git branch-remote-fetch #"
branch-url-fetch = !"remote=$(git branch-remote-fetch) && git remote get-url        \"$remote\" #"  # cognizant of insteadOf
branch-url-push  = !"remote=$(git branch-remote-push ) && git remote get-url --push \"$remote\" #"  # cognizant of pushInsteadOf
Tom Hale
fuente
que idioma es ese
Daniel Farrell
3
@Dan Farrell: concha. Alias ​​que comienzan con a! use / bin / sh. Las comillas dobles se citan para el archivo de configuración de git.
Tom Hale
0

Si estás usando Gradle,

def gitHash = new ByteArrayOutputStream()
    project.exec {
        commandLine 'git', 'rev-parse', '--short', 'HEAD'
        standardOutput = gitHash
    }

def gitBranch = new ByteArrayOutputStream()
    project.exec {
        def gitCmd = "git symbolic-ref --short -q HEAD || git branch -rq --contains "+getGitHash()+" | sed -e '2,\$d'  -e 's/\\(.*\\)\\/\\(.*\\)\$/\\2/' || echo 'master'"
        commandLine "bash", "-c", "${gitCmd}"
        standardOutput = gitBranch
    }
ravikanth
fuente
-2

El siguiente comando se referirá a la bifurcación actual de origen remoto.

git remote -v

Para agregar una ruta remota,

git remote add origin nombre_ruta

Nagaraja G Devadiga
fuente
aquí no está encontrando una ruta remota - está agregando
serup