web-dev-qa-db-fra.com

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

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

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

237
PJ.

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)

Ensuite, 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 le git remote show Origin commande à nouveau, 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
197
Jeremy Bouse

Pour toutes les branches:

git branch -avv

Pour les succursales locales uniquement:

git branch -lvv

Pour les succursales distantes uniquement:

git branch -rvv

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

125
sunew

Jeremy Bouse illustre comment git remote show Affiche les informations de suivi . Cela devrait être suffisant si vous ne voulez que les informations pour la consommation humaine.

Si vous prévoyez d'utiliser les informations dans un contexte automatisé (par exemple un script), vous devez utiliser le niveau inférieur ("plomberie") git for-each-ref à la place.

% 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 git for-each-ref A appris le jeton %(upstream) dans Git 1.6. . Avec les versions antérieures de Git, vous devrez extraire les informations de suivi avec git config branch.<name>.remote Et git config branch.<name>.merge (En utilisant probablement git for-each-ref Pour créer les commandes pour chaque nom de branche locale).

52
Chris Johnsen

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

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

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

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

Vous pouvez généralement utiliser le branch@{upstream} syntaxe partout où une validation est attendue.

19
Mark Longair

J'utilise le script Shell suivant (nommé git-tracks) pour afficher la branche distante qui est 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 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 courante.

10
Ingo Karkat

.git/config le fichier fournira également les informations de la 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/*
8
Karthik
git branch -vv

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

5
Jarl

Ajoutez ces runes au [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:]]//"'
2
DaveR

J'avais besoin de trouver la branche distante correspondante (le cas échéant) pour chaque branche locale dans une boucle qui agissait 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").

0
Ville