Scopri quale filiale remota sta seguendo una filiale locale


843

Vedi anche:
Come posso vedere quali rami Git stanno monitorando quale ramo remoto / upstream?

Come posso sapere quale filiale remota sta seguendo una filiale locale?

Devo analizzare l' git configoutput o c'è un comando che lo farebbe per me?


18
Sheesh. Questo non è un duplicato esatto. Questo è un sottoinsieme dell'altro, ma ci sono altri modi per fare la domanda fuori, come git remote show origin. La risposta principale nell'altra domanda è uno script bash racchiuso qui la semplice risposta, che potrebbe essere utile per alcuni. Spero che questa domanda non sia completamente chiusa.
cdunn2001,

5
D'accordo, questo sicuramente non dovrebbe essere un inganno. Sta ponendo qualcosa di completamente diverso dalla domanda collegata
Adam Batkin,

Risposte:


1004

Ecco un comando che ti dà tutti i rami di tracciamento (configurato per 'pull'), vedi:

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

Devi passare in rassegna SHA e tutti i messaggi di commit a capo lungo, ma è veloce da digitare e ottengo i rami di tracciamento allineati verticalmente nella terza colonna.

Se hai bisogno di informazioni su entrambe le configurazioni 'pull' e 'push' per ramo, vedi l'altra risposta git remote show origin.


Aggiornare

A partire dalla versione 1.8.5 di git è possibile mostrare il ramo upstream con git statusegit status -sb


6
Questo output è più diretto di git branch -avo git remote show origin, il che ti dà MOLTI dati, non solo il telecomando monitorato
Semplificazione del

60
A proposito, le versioni più recenti di git (1.8.5.x) ora mostrano anche il ramo upstream durante git statuse git status -sb- quindi una volta aggiornato a 1.8.5.x, questa domanda (e risposta) è irrilevante.
jdsumsion,

11
Mentre questo ti dà le informazioni che desideri, non sono d'accordo in quanto è la risposta corretta. È una risposta allo stesso modo dando a qualcuno un dizionario risponde "come si scrive XYZ". nel caso specifico, vuoi USARE la risposta risultante (il nome del ramo) per qualche operazione .. Questa risposta mi aiuta solo a vederla visivamente ... non ti dà qualcosa di utilizzabile in un comando successivo.
UpAndAdam,

L'output di questo comando può essere fuorviante poiché un messaggio di commit può iniziare facilmente con ad esempio "[my-feature] ...". Si prega di vedere la risposta di @ cdunn2001 che mostra solo il ramo a monte (se presente) e nient'altro.
Jonas Berlin,

1
Concordo con @ jonas-berlin - la risposta di cdunn2001 è migliore se si desidera analizzare il risultato - la mia risposta è buona se stai cercando un comando semplice e sei disposto a scansionare visivamente l'output
jdsumsion

372

Due scelte:

% 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

12
Bello! Il primo dà brutti errori nel caso in cui non venga tracciato nulla, mentre il secondo è particolarmente utile per gli script. BTW %(refname:short)è il nome dell'attuale riferimento all'interno --format.
Tino,

9
git help revisions(una delle parti poco conosciute ma più utili dei documenti) e cerca upstream.
cdunn2001,

15
Questa risposta è molto meglio delle due risposte sopra di essa, specialmente se vuoi fare qualcosa del generegit diff `git rev-parse --abbrev-ref --symbolic-full-name @{upstream}`
Jian,

2
Questo è davvero utileecho '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 vuoi scoprire l'upstream per qualche altro ramo, una variante della seconda scelta è: git for-each-ref --format='%(upstream:short)' $(git rev-parse --symbolic-full-name SOMEBRANCH)sostituire SOMEBRANCH con il nome del ramo, o "HEAD" per il ramo corrente
Jonas Berlin,

220

Penso che git branch -avti dica solo in quali rami hai e in quale impegno si trovano, lasciandoti a dedurre quali rami remoti stanno seguendo i rami locali.

git remote show originti dice esplicitamente quali rami stanno monitorando quali rami remoti. Ecco un esempio di output da un repository con un singolo commit e un ramo remoto chiamato 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

contro

$ 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
Ho bisogno di un comando che scopra il ramo a monte, quindi usare 'origin' come input sta facendo un presupposto, quindi questo non funziona per me
Alexander Mills

1
Ma questo risponde al PO. Il comando git remote show originmostra i rami locali e ciò che tracciano sia per push che pull.
Dudewad,

1
@dudewad Penso che il punto sia che questo comando presuppone che venga chiamato il telecomando origin, mentre in realtà potrebbe essere qualsiasi cosa (ad es. telecomandi multipli, con rami diversi che tracciano rami da telecomandi diversi).
Ruslan,

74

Aggiornamento: Beh, sono passati diversi anni da quando l'ho pubblicato! Per il mio scopo specifico di confrontare HEAD con l'upstream, ora uso @{u}, che è una scorciatoia che si riferisce all'HEAD del ramo di tracciamento dell'upstream. (Vedi https://git-scm.com/docs/gitrevisions#gitrevisions-emltbranchnamegtupstreamemegemmasterupstreamememuem ).

Risposta originale: ho riscontrato anche questo problema. Uso spesso più telecomandi in un unico repository, ed è facile dimenticare quale è il tuo ramo attuale su cui sta monitorando. E a volte è utile saperlo, ad esempio quando si desidera guardare i propri impegni locali tramite git log remotename/branchname..HEAD.

Tutto questo materiale è archiviato nelle variabili git config, ma non è necessario analizzare l'output di git config. Se invochi git config seguito dal nome di una variabile, stamperà semplicemente il valore di quella variabile, non è necessario alcun analisi. Tenendo presente ciò, ecco alcuni comandi per ottenere informazioni sulla configurazione di tracciamento della filiale corrente:

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`

Nel mio caso, poiché sono interessato solo a scoprire il nome del mio telecomando attuale, lo faccio:

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

2
Questo è stato molto utile nel creare un alias per riformulare qualunque sia il mio ramo attuale. Grazie!
Justin Spahr-Summers,

Allo stesso modo utile per il nostro alias "veloce" che farà avanzare il ramo di localizzazione locale al telecomando fintanto che l'operazione è un avanzamento veloce.
Altreus,

4
In realtà ho scoperto che questo git name-rev --name-only HEADnon ti dirà su quale ramo stai effettivamente lavorando. Per questo ho appena usatogit branch | grep '^\*' | cut -d' ' -f2
Altreus il

1
Grazie! Altre risposte a domande simili non menzionavano @{u}alias / scorciatoia ed è esattamente quello che stavo cercando! Nessun motivo per confrontare con il ramo principale se si desidera solo determinare se è necessario eseguire il pull o meno.
Dan M.,

1
@{u}è la bomba. Ed è in circolazione dalla 1.7.0, il che significa che se non è disponibile in un git che qualcuno sta usando nel 2018, probabilmente sono dovuti per un aggiornamento.
Chris Cleeland,

48

Le filiali locali e i loro telecomandi.

git branch -vv 

Tutti i rami e i telecomandi di tracciamento.

git branch -a -vv

Scopri dove i rami locali sono esplicitamente configurati per push e pull.

git remote show {remote_name}

21

Questo ti mostrerà il ramo in cui ti trovi:

$ git branch -vv

Questo mostrerà solo l'attuale ramo in cui ti trovi:

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

per esempio:

myremote/mybranch

Puoi scoprire l'URL del telecomando utilizzato dal ramo corrente con cui ti trovi:

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

per esempio:

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

19

È possibile utilizzare git checkout, ad esempio "controlla il ramo corrente". Questa è una no-op con effetti collaterali per mostrare le informazioni di tracciamento, se esistenti, per il ramo corrente.

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

17

Non so se questo conta come l'analisi dell'output di git config, ma questo determinerà l'URL del telecomando che il master sta monitorando:

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

O git config branch.$(git symbolic-ref -q HEAD).remotese vuoi solo che il nome del telecomando venga tracciato del ramo corrente,git config remote.$(git config branch.$(git symbolic-ref -q HEAD).remote).url per l'URL.
Anakhand,

Avevo bisogno di aggiungere --shortun'opzione affinché funzioni. Quindi, per ottenere il nome remoto del ramo corrente: git config branch.$(git symbolic-ref -q --short HEAD).remotee per ottenere l'URL del telecomando del ramo corrente:git config remote.$(git config branch.$(git symbolic-ref -q --short HEAD).remote).url
Nelson

13

Ancora un altro modo

git status -b --porcelain

Questo ti darà

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

10

Un altro modo semplice è usare

cat .git/config in un repository git

Questo elencherà i dettagli per le filiali locali


Funziona bene su Linux. Non funzionerà su Windows se non in un prompt simile a Unix (ad esempio cygwin o git bash).
Contango

In Windows basta semplicemente usare type .git/configinvece cat .git/configovviamente sulla semplice riga di comando ..
khmarbaise

9

Un altro metodo (grazie osse), se vuoi solo sapere se esiste o meno:

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

Quale lingua? Sembra uno script di shell Linux ma non fornisce altre informazioni o contesto.
Suncat2000,

8

git branch -vv | grep 'BRANCH_NAME'

git branch -vv : Questa parte mostrerà tutte le filiali locali insieme alla loro filiale a monte.

grep 'BRANCH_NAME' : Filtrerà il ramo corrente dall'elenco dei rami.



5

Elenca le filiali locali e remote:

$ git branch -ra

Produzione:

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

3

L'output v2 di porcellana git-status (leggibile dalla macchina) è simile al seguente:

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

E per ottenere il ramo solo a monte:

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

Se il ramo non ha upstream, il comando sopra produrrà un output vuoto (o fallirà con set -o pipefail).


2

Se vuoi trovare l'upstream per qualsiasi ramo (al contrario di quello su cui ti trovi), ecco una leggera modifica alla risposta di @ cdunn2001:

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

Questo ti darà il nome del ramo remoto per il ramo locale chiamato YOUR_LOCAL_BRANCH_NAME.


2

Puoi provare questo:

git remote show origin | grep "branch_name"

branch_name deve essere sostituito con il tuo ramo


Cosa succede se il nome della tua filiale corrisponde anche ad altre filiali? Cosa succede al nome della tua filiale corrisponde ad altro testo nell'output di git remote show origin- se viene chiamato mergeso configure?
Tom Swirly,

non ti ho preso. vuoi dire più rami con gli stessi nomi
xpioneer

1

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

poi

git track

si noti che lo script può essere utilizzato anche per configurare il tracciamento.

Altri fantastici alias su https://github.com/orefalo/bash-profiles


0

Uso EasyGit (aka "ad esempio") come un involucro super leggero sopra (o lungo il lato) di Git. EasyGit ha un sottocomando "info" che fornisce tutti i tipi di informazioni super utili, incluso l'attuale ramo di tracciamento remoto delle filiali. Ecco un esempio (in cui l'attuale nome del ramo è "pippo"):

pknotz @ s883422: (pippo) ~ / workspace / bd
$ ad es. informazioni
Totale impegni: 175
Repository locale: .git
Repository remoti nominati: (nome -> posizione)
  origine -> git: //sahp7577/home/pknotz/bd.git
Filiale attuale: foo
  Checkum crittografico (sha1sum): bd248d1de7d759eb48e8b5ff3bfb3bb0eca4c5bf
  Repository pull / push predefinito: origine
  Opzioni pull / push predefinite:
    branch.foo.remote = origin
    branch.foo.merge = refs / heads / aal_devel_1
  Numero di partecipanti: 3
  Numero di file: 28
  Numero di directory: 20
  Dimensione file più grande, in byte: 32473 (pygooglechart-0.2.0 / COPYING)
  Impegni: 62

0

Migliorando su questa risposta , ho trovato questi .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

che lingua è quella?
Daniel Farrell,

3
@Dan Farrell: shell. Alias ​​che iniziano con a! usa / bin / sh. Le doppie virgolette sono citate per il file di configurazione di git.
Tom Hale,

0

Se stai 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

Il seguente comando farà riferimento al fork corrente di origine remota

git remote -v

Per aggiungere un percorso remoto,

git remote aggiungi origine nome_percorso


qui non trovi un percorso remoto - stai aggiungendo
serup
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.