2008-10-05 20 views
497

Ver también:
how do I get git to show me which branches are tracking what?Averigüe qué rama remota una sucursal local está siguiendo

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

¿Tengo que analizar la salida de configuración de git, o hay un comando que haría esto por mí?

+7

Sheesh. Este * no * es un duplicado exacto. Este es un subconjunto del otro, pero hay otras maneras de hacer la pregunta, como 'git remote show origin'. La respuesta principal en la otra pregunta es un guión 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

+4

De acuerdo, definitivamente esto no debería ser una tontería. Está pidiendo algo completamente diferente a la pregunta vinculada –

+3

el comando simple es 'git branch -vv' – vrdhn

Respuesta

3

Uso EasyGit (a.k.a. "eg") como una envoltura súper liviana en la parte superior (o junto a) de Git. EasyGit tiene un subcomando "información" que le brinda todo tipo de información súper útil, incluida la rama de seguimiento remoto de sucursales actuales. He aquí un ejemplo (donde el nombre de la rama actual es "foo"):

 
[email protected]: (foo) ~/workspace/bd 
$ eg info 
Total commits:  175 
Local repository: .git 
Named remote repositories: (name -> location) 
    origin -> git://sahp7577/home/pknotz/bd.git 
Current branch: foo 
    Cryptographic checksum (sha1sum): bd248d1de7d759eb48e8b5ff3bfb3bb0eca4c5bf 
    Default pull/push repository: origin 
    Default pull/push options: 
    branch.foo.remote = origin 
    branch.foo.merge = refs/heads/aal_devel_1 
    Number of contributors:  3 
    Number of files:  28 
    Number of directories:  20 
    Biggest file size, in bytes: 32473 (pygooglechart-0.2.0/COPYING) 
    Commits:  62 
+0

La URL de EasyGit ha cambiado ... ahora está en https://gitorious.org/eg – Ville

11

No sé si esto cuenta como analizando la salida de git config, pero esto va a determinar la dirección URL de la distancia que amo es seguimiento:

 
$ git config remote.$(git config branch.master.remote).url 
37

actualización: Bueno, han pasado varios años desde que he publicado esto! Para mi propósito específico de comparar HEAD con upstream, ahora uso @{u}, que es un atajo que hace referencia al HEAD de la rama de seguimiento ascendente. (Ver https://git-scm.com/docs/gitrevisions#gitrevisions-emltbranchnamegtupstreamemegemmasterupstreamememuem).

Original respuesta: Me he encontrado con este problema también. A menudo utilizo múltiples controles remotos en un único repositorio, y es fácil olvidar cuál es el seguimiento de su rama actual. Y a veces es útil saberlo, como cuando quiere ver sus confirmaciones locales a través del git log remotename/branchname..HEAD.

Todo esto está almacenado en las variables de configuración de git, pero no es necesario analizar la salida de configuración de git. Si invoca git config seguido del nombre de una variable, simplemente imprimirá el valor de esa variable, no se requiere análisis. Con esto en mente, he aquí algunos comandos para obtener información sobre la configuración de seguimiento de su rama 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, ya que sólo estoy interesado en saber el nombre de mi remoto actual, hago esto:

git config branch.`git name-rev --name-only HEAD`.remote 
+2

Esto fue muy útil para crear un alias para rebase cualquiera que sea mi rama actual. ¡Gracias! –

+0

También es útil para nuestro alias 'fastforward' que avanzará la rama de seguimiento local al control remoto siempre que la operación sea un avance rápido. – Altreus

+3

Realmente descubrí que 'git name-rev --name-only HEAD' no te dirá en qué rama estás realmente. Para eso acabo de usar 'git branch | grep '^ \ *' | cut -d '' -f2' – Altreus

179

creo git branch -av sólo le dice lo que las ramas que tiene y que practican están, dejando que se infiere que se ramifica a distancia las ramas locales están rastreando.

git remote show origin indica explícitamente qué ramas están rastreando qué ramas remotas.Aquí hay una salida de ejemplo de un repositorio con una única confirmación y una rama remota llama 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 

frente

$ 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) 
+4

Una vez más, esta no debería ser la respuesta correcta, y no es diferente de la respuesta anterior, que es más correcta para el caso en cuestión que la pregunta sobre las sucursales locales. – UpAndAdam

+3

Necesito un comando que * descubre * la rama ascendente, por lo que usar 'origen' como entrada es una suposición, por lo que esto no funciona para mí –

+0

Pero esto RESPONDE al OP. El comando 'git remote show origin' muestra las ramas locales y lo que rastrean tanto para empujar como para tirar. – dudewad

248

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 
+10

¡Agradable! El primero arroja errores feos en caso de que no se rastree nada, mientras que el segundo es especialmente útil para los scripts. BTW '% (refname: short)' es el nombre de la referencia actual dentro de '--format'. – Tino

+1

¡Esto es genial! Me sorprende que la segunda opción funcione más rápido en mi máquina. Parece que se llama git dos veces, pero ciertamente funciona más rápido. ¿Alguna idea de por qué es esto? – scicalculator

+0

¡Impresionante! ¿Pueden señalarme en los documentos donde el @ {u} entra en juego? No es familiar y me encantaría entender eso mejor. –

1

yo utilizar 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 
" -' 

continuación

git track 

nota de que el script también se puede utilizar para el seguimiento de la instalación.

más grandes alias en https://github.com/orefalo/bash-profiles

632

Here es un comando que le da la rama de seguimiento:

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

Tienes que caminar por el SHA y cualquier largo de envolver los mensajes de confirmación, pero es rápida a escriba y obtengo las ramas de seguimiento alineadas verticalmente en la tercera columna.


actualización

partir de la versión 1.8.5 de Git se puede mostrar la rama aguas arriba con git status y git status -sb

+3

Esta salida es más directa que 'git branch -av' o' git remote show origin', que le da MUCHOS datos, no solo el control remoto – SimplGy

+25

BTW, las últimas versiones de git (1.8.5.x) también ahora muestra la rama ascendente durante 'git status' y' git status -sb', por lo que una vez que actualice a 1.8.5.x, esta pregunta (y respuesta) es irrelevante. – jdsumsion

+0

Sí. Lo segundo. Esta es la respuesta correcta. Aquí el maestro está rastreando el jdsumsion/master remoto en el ejemplo anterior. – BHS

10

Puede utilizar git checkout, es decir, "echa un vistazo a la rama actual". Este es un no-operativo 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'. 
7

Otra forma sencilla es utilizar

cat .git/config en un repositorio git

Esto mostrará los detalles de las secciones locales

+0

Funciona muy bien en Linux. No funcionará en Windows a menos que esté en un mensaje tipo Unix (por ejemplo, cygwin o git bash). – Contango

+0

En Windows, simplemente use 'escriba .git/config' en lugar de' cat .git/config', por supuesto, en la línea de comando simple. – khmarbaise

-3

siguiente comando remoto origen tenedor actual se refiere a

git remoto -v

Para añadir una ruta remota,

git add remoto origen nombre_vía

+1

No estoy seguro de por qué esto fue votado, ya que esta es solo una respuesta incorrecta. -1 –

+0

aquí no encuentra una ruta remota; está agregando – serup

7

Otro método (gracias Osse), si lo que desea saber si es o no existe:

if git rev-parse @{u} > /dev/null 2>&1 
then 
    printf "has an upstream\n" 
else 
    printf "has no upstream\n" 
fi 
8

embargo, otra forma

git status -b --porcelain 

Esto le

## BRANCH(...REMOTE) 
modified and untracked files 
7
git branch -r -vv 

dará mostrará una lista de todas las ramas, incluyendo a distancia.

33

Las sucursales locales y sus controles remotos.

git branch -vv 

Todas las ramas y controles de seguimiento.

git branch -a -vv 

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

git remote show {remote_name} 
0

Si está utilizando 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 
       } 

` ``

10

Esto le mostrará la rama que está en:

$ git branch -vv 

Esto mostrará Sólo la rama actual está en:

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

por ejemplo:

myremote/mybranch 

Puede averiguar la dirección URL de la remota que se utiliza por el rama actual usted está en la :

$ 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 
Cuestiones relacionadas