Comment savoir quelle branche locale suit quelle branche distante dans Git?

234

J'aimerais savoir s'il existe un moyen de savoir quelle branche locale suit quelle branche distante dans Git.

J'utilise un serveur distant nommé "origine".

P J.
la source
Corrigez-moi si je me trompe, mais n'est-ce pas une branche distante nommée origine par défaut plutôt que le serveur?
Chris Halcrow

Réponses:

196

En utilisant l'exemple de ma copie de Puppet extraite du référentiel Git en amont sur 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)

Alors si je devais exécuter ce qui suit:

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

Et enfin, relancez la git remote show origincommande et je verrai ensuite ce qui suit vers le bas:

  Local branches configured for 'git pull':
    local_2.6 merges with remote 2.6.x
    master    merges with remote master
Jeremy Bouse
la source
1
Cela signifie-t-il que vous pouvez suivre toutes les branches distantes de la marionnette bien que vous disposiez de quelques branches locales? Quels sont les nombreux signes "suivis" que vous voyez dans le résultat de la commande? "suivi" par quelle branche locale?
PJ.
Les branches isolées sont suivies en ce que si vous faites une git fetchou des git pullmises à jour aux branches à distance seront suivis dans votre dépôt cloné. Les branches locales ne sont que cela, les branches locales des branches distantes et donc les mises à jour des branches distantes seront suivies et fusionnées lorsque la commande appropriée pour le faire sera donnée. J'inclus explicitement l'option '-t' lors de la création de la branche locale afin de m'assurer qu'elle suit bien la branche d'où elle provient. N'oubliez pas qu'une branche locale peut également suivre une autre branche locale, de sorte qu'elle ne doit pas nécessairement être une branche distante.
Jeremy Bouse
5
@PJ: Le terme "piste" a deux significations distinctes dans Git. Les lignes «suivies» dans se git remote show remote-nameréfèrent à «branches de suivi» (instantanés de branches à partir de référentiels distants). Les lignes «fusionne avec» font référence aux branches locales qui ont une configuration de «branche en amont» (réalisée avec l' option --track/ -tde git branch ou de git checkout et qui est donc souvent confondue avec «suivi de branche»).
Chris Johnsen
" branche de suivi à distance " est l'entrée de glossaire à jour pour les "branches de suivi" mentionnées ci-dessus. La doc a été mise à jour dans 8b3f3f84 .
Ento
124

Pour toutes les branches:

git branch -avv

Pour les agences locales uniquement:

git branch -lvv

Pour les agences distantes uniquement:

git branch -rvv

vous montre toutes les branches ainsi que le nom de la branche en amont.

crépuscule
la source
2
C'est de loin la réponse la plus simple et la plus complète!
6
Sur la version 1.7.7.5 de git, cela me montre la branche locale et le sha-1 indiqué, mais ne montre pas la branche distante suivie ...
mpontillo
Fonctionne pour moi sur la version 1.7.4.1 de git Le deuxième 'v' est requis pour afficher la branche de suivi à distance.
Peter Johnson
4
pour réduire la production git branch -lvvmontrent que seules les branches locales avec l'amont pourraient être utiles
AB
5
^ git branch -vvtravaille pour moi ...
notacouch
52

Jeremy Bouse montre comment git remote showafficher les informations de suivi . Cela devrait suffire si vous ne souhaitez que les informations destinées à la consommation humaine.

Si vous envisagez d'utiliser les informations dans un contexte automatisé (par exemple, un script), vous devez git for-each-refplutôt utiliser le niveau inférieur («plomberie») .

% 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

Le jeton git for-each-refappris %(upstream)dans Git 1.6.3 . Avec les versions antérieures de Git, vous devrez extraire les informations de suivi avec git config branch.<name>.remoteet git config branch.<name>.merge(probablement en utilisant git for-each-refpour construire les commandes pour chaque nom de branche locale).

Chris Johnsen
la source
Le résultat de vos réponses est beaucoup plus succinct et facile à suivre, vous obtenez donc le vote
positif
Pour le rendre moins succinct, tout en fournissant un moyen agréable de vérifier visuellement que les noms distants sont identiques aux noms des branches locales, un idiot bien connu: en bashgit for-each-ref --format=$'\n'' '' '' '' '' '' ''/%(refname:short);%(upstream:short)' refs/heads | tr ';' $'\n'
hobs
19

Pour une branche particulière, vous pouvez utiliser git rev-parsele suffixe @{u}ou @{upstream}le nom de la branche, par exemple:

$  git rev-parse --symbolic-full-name [email protected]{u}
refs/remotes/github-mhl/master

... ou pour la forme abrégée, ajouter --abbrev-ref

$ git rev-parse --symbolic-full-name --abbrev-ref [email protected]{u}
github-mhl/master

Vous pouvez généralement utiliser la [email protected]{upstream}syntaxe partout où un commit est attendu.

Mark Longair
la source
1
+1 Votre réponse m'a donné exactement ce dont j'avais besoin: git rev-parse --symbolic-full-name HEADvs git rev-parse --symbolic-full-name [email protected]{u}, merci!
Tino
10

J'utilise le script shell suivant (nommé git-tracks) pour afficher la branche distante suivie par la branche actuelle:

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

Cela pourrait également utiliser le mentionné git for-each-ref, mais j'ai trouvé l'accès direct un peu plus simple que le filtrage de la sortie pour la branche actuelle.

Ingo Karkat
la source
Vous pourriez envisager d'utiliser "set -e" en haut du script. Cela vous permettra de supprimer toutes les instances de "|| exit $?" tout en conservant le même comportement d'échec précoce.
John Whitley
@ JohnWhitley: Merci, j'ai modifié ma réponse. Je sais à propos set -e, mais généralement s'en tenir à la vérification explicite. Mais dans ce cas, c'est vraiment mieux.
Ingo Karkat
Ne travaille pas pour moi git version 1.9.4. Echos rien :(
Ain
8

.git/config fichier fournira également les informations de branche de suivi comme

[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/*
Karthik
la source
5
git branch -vv

montre exactement ce que vous demandez. Il montre les branches locales avec la branche distante correspondante qu'elles suivent.

Jarl
la source
2

Ajoutez ces runes à la [alias]section de votre fichier .gitconfig:

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

Je devais trouver la branche distante correspondante (le cas échéant) pour chaque branche locale d'une boucle agissant sur une liste des branches locales. J'ai fini par utiliser ce qui suit:

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

Cela ne produira rien (une chaîne vide) pour les branches locales qui n'ont pas de branche distante correspondante ("someremote / somebranch").

Ville
la source
-1

Essayez git branch avec des options :

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

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

Sinon, examinez votre .git/config.

Andrew
la source
3
Ils montrent des branches, mais je ne comprends pas lequel recherche.
PJ.