Descubra qual filial remota uma filial local está rastreando


843

Consulte também:
Como posso ver quais ramificações do Git estão rastreando qual ramificação remota / upstream?

Como posso descobrir qual filial remota uma filial local está rastreando?

Preciso analisar a git configsaída ou existe um comando que faria isso por mim?


18
Sheesh. Esta não é uma duplicata exata. Este é um subconjunto do outro, mas existem outras maneiras de fazer a pergunta, como git remote show origin. A resposta principal na outra pergunta é um script bash em torno da resposta simples aqui, que pode ser útil para alguns. Esperamos que esta questão não seja completamente fechada.
cdunn2001

5
Concordou que isso definitivamente não deveria ser um engodo. Ele está pedindo algo completamente diferente do que a questão ligada
Adam Batkin

Respostas:


1004

Aqui está um comando que fornece todas as ramificações de rastreamento (configuradas para 'pull'), consulte:

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

Você precisa percorrer o SHA e todas as mensagens de confirmação de quebra longa, mas é rápido digitar e alinhar os ramos de rastreamento verticalmente na terceira coluna.

Se você precisar de informações sobre as configurações 'pull' e 'push' por filial, consulte a outra resposta git remote show origin.


Atualizar

A partir da versão 1.8.5 do git, é possível mostrar o ramo upstream com git statusegit status -sb


6
Esta saída é mais direta do que git branch -avou git remote show origin, o que dará uma grande quantidade de dados, não apenas o acompanhou à distância
SimplGy

60
BTW, as versões mais recentes do git (1.8.5.x) agora também mostram a ramificação upstream durante git statuse git status -sb- então, quando você atualiza para o 1.8.5.x, esta pergunta (e resposta) é irrelevante.
Jsumsion

11
Embora isso lhe dê as informações desejadas, eu discordo por ser a resposta correta. É uma resposta da mesma maneira que fornecer a alguém um dicionário responde "como se escreve XYZ". Nesse caso, você deseja usar a resposta resultante (o nome do ramo) para alguma operação .. Essa resposta só me ajuda a visualizá-la visualmente ... não fornece algo utilizável em um comando subseqüente.
UpAndAdam

A saída deste comando pode ser enganosa, pois uma mensagem de confirmação pode começar facilmente com, por exemplo, "[my-feature] ...". Por favor, veja a resposta do @ cdunn2001 que mostra apenas o ramo upstream (se houver) e nada mais.
Jonas Berlin

1
Concordo com @ jonas-berlin - resposta das cdunn2001 é melhor se você quiser analisar o resultado - a minha resposta é bom se você estiver procurando por um comando simples e estão dispostos a examinar visualmente a saída
jdsumsion

372

Duas escolhas:

% git rev-parse --abbrev-ref --symbolic-full-name @{u}
origin/mainline

ou

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

12
Agradável! O primeiro apresenta erros feios caso nada seja rastreado, enquanto o segundo é especialmente útil para scripts. BTW %(refname:short)é o nome da referência atual dentro --format.
Tino

9
git help revisions(uma das partes pouco conhecidas, mas mais úteis dos documentos) e procure upstream.
cdunn2001

15
Esta resposta é muito melhor do que as duas respostas acima, especialmente se você quer fazer algo comogit diff `git rev-parse --abbrev-ref --symbolic-full-name @{upstream}`
Jian

2
Isso é 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

6
Se você quiser saber o montante por algum outro ramo, uma variante da segunda escolha é: git for-each-ref --format='%(upstream:short)' $(git rev-parse --symbolic-full-name SOMEBRANCH)substituir SOMEBRANCH com o nome de ramo, ou "cabeça" para o ramo atual
Jonas Berlin

220

Eu acho que git branch -avapenas informa em quais ramificações você tem e em quais confirmações elas estão, deixando-o deduzir em quais ramificações remotas as ramificações locais estão rastreando.

git remote show origininforma explicitamente quais filiais estão rastreando quais filiais remotas. Aqui está um exemplo de saída de um repositório com uma única confirmação e uma ramificação remota chamada 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)

3
Eu preciso de um comando que descobre o ramo a montante, portanto, usando 'origem' como entrada está fazendo uma suposição, e isso não funciona para mim
Alexander Mills

1
Mas isso responde ao OP. O comando git remote show originmostra as ramificações locais e o que elas rastreiam para empurrar e puxar.
Dudewad

1
@dudewad Acho que o argumento era que esse comando pressupõe que o controle remoto seja chamado origin, embora possa realmente ser qualquer coisa (por exemplo, vários controles remotos, com diferentes ramos rastreando ramos de diferentes controles remotos).
Ruslan

74

Atualização: Bem, já faz vários anos desde que eu publiquei isso! Para o meu objetivo específico de comparar o HEAD com o upstream, agora uso @{u}, que é um atalho que se refere ao HEAD do ramo de rastreamento upstream. (Consulte https://git-scm.com/docs/gitrevisions#gitrevisions-emltbranchnamegtupstreamemegemmasterupstreamememuem ).

Resposta original: Também deparei com esse problema. Costumo usar vários controles remotos em um único repositório, e é fácil esquecer em qual deles sua filial atual está rastreando. E, às vezes, é útil saber disso, como quando você deseja ver os commits locais via git log remotename/branchname..HEAD.

Todo esse material é armazenado nas variáveis ​​de configuração do git, mas você não precisa analisar a saída do git config. Se você chamar o git config seguido pelo nome de uma variável, ele imprimirá apenas o valor dessa variável, sem necessidade de análise. Com isso em mente, aqui estão alguns comandos para obter informações sobre a configuração de rastreamento de sua filial atual:

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`

No meu caso, como só estou interessado em descobrir o nome do meu controle remoto atual, faço o seguinte:

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

2
Isso foi muito útil para criar um alias para rebase, seja qual for o meu ramo atual. Obrigado!
precisa saber é o seguinte

Da mesma forma, é útil para o nosso alias 'fastforward', que encaminhará o ramo de rastreamento local para o controle remoto, desde que a operação seja um avanço rápido.
Altreus

4
Na verdade, eu descobri que isso git name-rev --name-only HEADnão dirá em que ramo você está. Por que eu simplesmente usadogit branch | grep '^\*' | cut -d' ' -f2
Altreus

1
Obrigado! Outras respostas para perguntas semelhantes não mencionaram @{u}pseudônimo / atalho e é exatamente isso que eu estava procurando! Não há razão para comparar com a ramificação principal se você quiser determinar se precisa puxar ou não.
Dan M.

1
@{u}é a bomba. E existe desde a 1.7.0, o que significa que, se não estiver disponível em um git que alguém esteja usando em 2018, provavelmente haverá uma atualização.
Chris Cleeland

48

Os ramos locais e seus controles remotos.

git branch -vv 

Todos os ramos e controles remotos de rastreamento.

git branch -a -vv

Veja onde as ramificações locais estão explicitamente configuradas para push and pull.

git remote show {remote_name}

21

Isso mostrará a filial em que você está:

$ git branch -vv

Isso mostrará apenas o ramo atual em que você está:

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

por exemplo:

myremote/mybranch

Você pode descobrir o URL do controle remoto usado pela filial atual com a qual você está:

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

por exemplo:

https://github.com/someone/somerepo.git

19

Você pode usar git checkout, ou seja, "confira o ramo atual". Este é um no-op com efeitos colaterais para mostrar as informações de rastreamento, se existir, do ramo atual.

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

17

Não sei se isso conta como analisar a saída do git config, mas isso determinará a URL do controle remoto que o mestre está rastreando:

$ git config remote. $ (configuração do git branch.master.remote) .url

Ou git config branch.$(git symbolic-ref -q HEAD).remotese você quiser apenas o nome do controle remoto sendo rastreado da ramificação atual -git config remote.$(git config branch.$(git symbolic-ref -q HEAD).remote).url para o URL.
Anakhand

Eu precisava adicionar a --shortopção para que funcionasse. Portanto, para obter o nome remoto do ramo atual: git config branch.$(git symbolic-ref -q --short HEAD).remotee para obter o URL do controle remoto do ramo atual:git config remote.$(git config branch.$(git symbolic-ref -q --short HEAD).remote).url
Nelson

13

Ainda outra maneira

git status -b --porcelain

Isso lhe dará

## BRANCH(...REMOTE)
modified and untracked files

10

Outra maneira simples é usar

cat .git/config em um repositório git

Isso listará detalhes das filiais locais


Funciona bem no Linux. Não funcionará no Windows, a menos que seja solicitado pelo Unix (por exemplo, cygwin ou git bash).
Contango 2/11

No Windows simplesmente usar type .git/configem vez de cat .git/config, claro, na linha de comando simples ..
khmarbaise

9

Outro método (obrigado osse), se você quer apenas saber se existe ou não:

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

Que lingua? Parece um script de shell do Linux, mas não fornece outras informações ou contexto.
Suncat2000

8

git branch -vv | grep 'BRANCH_NAME'

git branch -vv : Esta parte mostrará todas as ramificações locais junto com sua ramificação upstream.

grep 'BRANCH_NAME' : Filtrará a ramificação atual da lista de ramificações.



5

Lista ramificações locais e remotas:

$ git branch -ra

Resultado:

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

3

A saída v2 de porcelana com status git (legível por máquina) fica assim:

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

E para obter o ramo apenas a montante:

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

Se a ramificação não tiver upstream, o comando acima produzirá uma saída vazia (ou falhará com set -o pipefail).


2

Se você deseja encontrar o upstream para qualquer ramificação (ao contrário da que você está), aqui está uma pequena modificação na resposta do @ cdunn2001:

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

Isso fornecerá o nome da ramificação remota para a ramificação local denominada YOUR_LOCAL_BRANCH_NAME.


2

Você pode tentar isso:

git remote show origin | grep "branch_name"

branch_name precisa ser substituído por sua filial


O que acontece se o nome do seu ramo também corresponder a outros ramos? O que acontece com o nome da sua filial que corresponde a algum outro texto na saída de git remote show origin- se for chamado mergesou configure?
21419 Tom

não te entendi. quer dizer várias ramificações tendo mesmos nomes
xpioneer

1

Eu uso esse apelido

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

então

git track

observe que o script também pode ser usado para configurar o rastreamento.

Mais ótimos aliases em https://github.com/orefalo/bash-profiles


0

Eu uso o EasyGit (aka "eg") como um invólucro super leve em cima (ou ao lado) do Git. O EasyGit possui um subcomando "info" que fornece todos os tipos de informações super úteis, incluindo o ramo de rastreamento remoto das agências atuais. Aqui está um exemplo (onde o nome do ramo atual é "foo"):

pknotz @ s883422: (foo) ~ / espaço de trabalho / bd
$ eg informações
Total de confirmações: 175
Repositório local: .git
Repositórios remotos nomeados: (nome -> local)
  origem -> git: //sahp7577/home/pknotz/bd.git
Ramo atual: foo
  Soma de verificação criptográfica (sha1sum): bd248d1de7d759eb48e8b5ff3bfb3bb0eca4c5bf
  Repositório pull / push padrão: origin
  Opções padrão de pull / push:
    branch.foo.remote = origem
    branch.foo.merge = refs / heads / aal_devel_1
  Número de colaboradores: 3
  Número de arquivos: 28
  Número de diretórios: 20
  Maior tamanho de arquivo, em bytes: 32473 (pygooglechart-0.2.0 / COPYING)
  Compromissos: 62

0

Melhorando esta resposta , .gitconfigcriei esses aliases:

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

que língua é essa?
Daniel Farrell

3
@ Dan Farrell: concha. Aliases começando com a! use / bin / sh. As aspas duplas são citadas para o arquivo de configuração do git.
21818 Tom Hale #

0

Se você estiver 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
    }

-2

O comando a seguir irá se referir à bifurcação atual de origem remota

git remote -v

Para adicionar um caminho remoto,

origem remota git adicionar origem path_name


aqui você não encontra um caminho remoto - você está adicionando
serup
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.