Como saber qual ramificação local está rastreando qual ramificação remota no Git?

232

Gostaria de saber se existe uma maneira de saber qual ramificação local está rastreando qual ramificação remota no Git.

Estou usando um servidor remoto chamado "origem".

    
por PJ. 27.08.2010 / 03:04

10 respostas

197

Usando o exemplo da minha cópia do Puppet com check-out do repositório Git do upstream no 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)

Então, se eu fosse executar o seguinte:

$ 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'

E, finalmente, execute novamente o comando git remote show origin novamente. Eu veremos o seguinte abaixo na parte inferior:

  Local branches configured for 'git pull':
    local_2.6 merges with remote 2.6.x
    master    merges with remote master
    
por 27.08.2010 / 05:03
122

Para todos os ramos:

git branch -avv

Apenas para filiais locais:

git branch -lvv

Somente para ramos remotos:

git branch -rvv

mostra todos os ramos, bem como o nome do ramo do upstream.

    
por 14.02.2012 / 17:02
52

Jeremy Bouse ilustra como git remote show exibe informações de rastreamento . Isso deve ser suficiente se você quiser apenas as informações para consumo humano.

Se você planeja usar as informações em um contexto automatizado (por exemplo, um script), você deve usar o nível mais baixo (“encanamento”) git for-each-ref em vez disso.

% 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

O git for-each-ref aprendeu o token %(upstream) no Git 1.6 .3 . Com as versões anteriores do Git, você terá que extrair as informações de rastreamento com git config branch.<name>.remote e git config branch.<name>.merge (provavelmente usando git for-each-ref para criar os comandos para cada nome de ramificação local).

    
por 27.08.2010 / 05:18
18

Para uma ramificação específica, você pode usar git rev-parse com o sufixo @{u} ou @{upstream} no nome da ramificação, por exemplo:

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

... ou para o formato abreviado, adicione --abbrev-ref

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

Você geralmente pode usar a sintaxe branch@{upstream} sempre que uma confirmação for esperada.

    
por 01.05.2012 / 11:18
10

Eu uso o script de shell a seguir (denominado git-tracks ) para mostrar o ramo remoto que é rastreado pelo ramo atual:

#!/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:?}"

Isso também poderia usar o git for-each-ref mencionado, mas achei o acesso direto um pouco mais simples do que filtrar a saída para o ramo atual.

    
por 21.01.2012 / 15:26
8

.git/config file também fornecerá as informações da ramificação de rastreamento 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/*
    
por 11.10.2012 / 14:59
5
git branch -vv

mostra exatamente o que você pede. Ela mostra as ramificações locais junto com a ramificação remota correspondente que estão rastreando.

    
por 07.05.2013 / 09:50
2

Adicione estas runas à seção [alias] do seu arquivo .gitconfig:

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

Eu precisava encontrar o ramo remoto correspondente (se houver) para cada ramificação local em um loop que estava agindo em uma lista de ramificações locais. Acabei usando o seguinte:

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

Isso não produzirá nada (uma string vazia) para ramificações locais que não tenham uma ramificação remota correspondente ("someremote / somebranch").

    
por 23.11.2013 / 01:08
-1

Experimente git branch com opções :

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

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

Caso contrário, examine seu .git/config .

    
por 27.08.2010 / 03:12