Como saber qual filial local está rastreando qual filial remota no Git?


234

Gostaria de saber se há uma maneira de saber qual filial local está rastreando qual filial remota no Git.

Estou usando um servidor remoto, chamado "origem".


Corrija-me se eu estiver errado, no entanto, não é uma ramificação remota chamada origem por padrão, e não o servidor?
precisa

Respostas:


196

Usando o exemplo da minha cópia do Puppet extraída do repositório Git 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 git remote show originnovamente o comando novamente. Verei o seguinte na parte inferior:

  Local branches configured for 'git pull':
    local_2.6 merges with remote 2.6.x
    master    merges with remote master

1
Isso significa que você pode rastrear todas as filiais remotas no fantoche, embora você tenha algumas filiais locais. Quais são os muitos sinais "rastreados" significa que você vê o resultado do comando? "rastreado" por qual filial local?
PJ.

As ramificações remotas são rastreadas porque, se você fizer uma git fetchou git pullatualizações das ramificações remotas, serão rastreadas no seu repositório clonado. As ramificações locais são exatamente isso, ramificações locais das ramificações remotas e, portanto, as atualizações nas ramificações remotas serão rastreadas e mescladas quando o comando apropriado para isso é fornecido. Incluí explicitamente a opção '-t' ao criar a ramificação local para garantir que ela rastreie a ramificação da qual se originou. Lembre-se de que uma ramificação local também pode rastrear outra ramificação local, portanto, não precisa ser uma ramificação remota.
precisa saber é o seguinte

5
@PJ: O termo "faixa" tem dois significados distintos no Git. As linhas "rastreadas" git remote show remote-namereferem-se a "rastreamento de ramificações" (capturas instantâneas de ramificações de repositórios remotos). As linhas "mesclam com" referem-se a ramificações locais que possuem uma configuração de "ramificação upstream" (feita com a opção --track/ -tdo ramo git ou check - out git e, portanto, frequentemente confundida com "ramos de rastreamento").
31810 Chris Johnsen

" ramificação de rastreamento remoto " é a entrada atualizada do glossário para "ramificações de rastreamento" mencionadas acima. O documento foi atualizado em 8b3f3f84 .
ento 12/09/2013

124

Para todos os ramos:

git branch -avv

Apenas para filiais locais:

git branch -lvv

Apenas para filiais remotas:

git branch -rvv

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


2
Esta é de longe a resposta mais simples e completa!

6
Em git versão 1.7.7.5 isso está me mostrando o ramo local e o sha-1 ele aponta, mas não mostra a filial remota rastreado ...
mpontillo

Funciona para mim no git versão 1.7.4.1 O segundo 'v' é necessário para mostrar a ramificação de rastreamento remoto.
Peter Johnson

4
para reduzir a produção git branch -lvvmostra apenas ramos locais com a montante pode ser útil
AB

5
^ git branch -vvfunciona para mim ...
notacouch 21/03

52

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

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

% 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-refaprendeu o %(upstream)token no Git 1.6.3 . Nas versões anteriores do Git, você terá que extrair as informações de rastreamento com git config branch.<name>.remotee git config branch.<name>.merge(provavelmente usando git for-each-refpara criar os comandos para cada nome de filial local).


Sua saída respostas é muito mais sucinto e mais fácil de seguir, de modo a obter o voto up :)
CubanX

Para torná-lo menos sucinta, mas fornecem uma boa maneira de verificar visualmente que os nomes remotos são os mesmos que os nomes filial local, uma pegadinha git comum: em bashgit for-each-ref --format=$'\n'' '' '' '' '' '' ''/%(refname:short);%(upstream:short)' refs/heads | tr ';' $'\n'
placa

19

Para um ramo específico, você pode usar git rev-parsecom o sufixo @{u}ou @{upstream}no nome do ramo, por exemplo:

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

... ou para o formulário abreviado, adicione --abbrev-ref

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

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


1
+1 Sua resposta me deu exatamente o que eu precisava: git rev-parse --symbolic-full-name HEADvs. git rev-parse --symbolic-full-name HEAD@{u}, obrigado!
Tino

10

Eu uso o seguinte script de shell (nomeado git-tracks) para mostrar a ramificação remota que é rastreada pela ramificação 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 mencionado git for-each-ref, mas achei o acesso direto um pouco mais simples do que filtrar a saída do ramo atual.


Você pode considerar usar "set -e" na parte superior do script. Isso permitirá que você remova todas as instâncias de "|| exit $?" mantendo o mesmo comportamento de falha antecipada.
John Whitley

@ JohnWhitley: Obrigado, eu editei minha resposta. Eu sei set -e, mas geralmente me ater à verificação explícita. Mas neste caso, é realmente melhor.
Ingo Karkat

Não está trabalhando para mim git version 1.9.4. Echos nothing :(
Ain

8

.git/config O arquivo também fornecerá as informações da filial 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/*

5
git branch -vv

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


2

Adicione estas runas à [alias]seção 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:]]//"'

0

Eu precisava encontrar o ramo remoto correspondente (se houver) para cada ramo local em um loop que estava atuando em uma lista dos ramos 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 sequência vazia) para ramificações locais que não possuem uma ramificação remota correspondente ("someremote / somebranch").


-1

Tente git branch com as 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 o seu .git/config.


3
Eles mostram ramos, mas não entendo qual deles está rastreando qual.
PJ.
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.