Comment voir quelles branches git tracent quelle branche distante / amont?

je sais que je peux faire git branch --all et qui me montre à la fois en local et à distance des branches, mais il n'est pas utile en me montrant les relations entre eux.

Comment puis-je lister les branches d'une manière qui montre quelle branche locale suit quelle télécommande?

631
git
demandé sur Chris Stryczynski 2011-02-10 00:30:46

10 réponses

très bien une commande de porcelaine, pas bon si vous voulez cela pour le script:

git branch -vv   # doubly verbose!

notez qu'avec le git 1.8.3, cette branche amont est affichée en bleu (voir " Qu'est-ce que cette branche de suivi (s'il y a lieu) dans le git? ")


si vous voulez une sortie propre, voir réponse d'arcresu - il utilise une commande de porcelaine que je ne crois pas exister à la fois où j'ai écrit cette réponse, donc c'est un peu plus concis et fonctionne avec les branches configurées pour rebase, pas seulement fusionner.

868
répondu Cascabel 2017-05-23 11:55:02

git remote show origin

remplacez "origine" par le nom de votre télécommande.

189
répondu kubi 2011-02-09 21:34:30

une alternative à la réponse de kubi est de regarder le fichier .git/config qui montre la configuration du dépôt local:

cat .git/config

73
répondu Abizern 2014-03-22 15:12:11

si vous regardez la page de manuel de git-rev-parse ,vous verrez que la syntaxe suivante est décrite:

<branchname>@{upstream} , par exemple: master@{upstream} , @{u}

le suffixe @{upstream} à un nom de branche (forme abrégée <branchname>@{u} ) se réfère à la branche que la branche spécifiée par branchname est défini pour construire sur le dessus de. Un nom de branche manquant par défaut de l'actuel.

donc pour trouver l'amont de la branche master , vous feriez:

git rev-parse --abbrev-ref master@{upstream}
# => origin/master

pour imprimer l'information pour chaque branche, vous pourriez faire quelque chose comme:

while read branch; do
  upstream=$(git rev-parse --abbrev-ref $branch@{upstream} 2>/dev/null)
  if [[ $? == 0 ]]; then
    echo $branch tracks $upstream
  else
    echo $branch has no upstream configured
  fi
done < <(git for-each-ref --format='%(refname:short)' refs/heads/*)

# Output:
# master tracks origin/master
# ...

c'est plus propre que parsing refs et config manuellement.

71
répondu Carl Suster 2018-09-19 15:14:13

pour la branche current , voici deux bons choix:

% 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

cette réponse est aussi ici , à une question légèrement différente qui a été (à tort) marquée comme un duplicata.

30
répondu cdunn2001 2017-05-23 12:10:45
git for-each-ref --format='%(refname:short) <- %(upstream:short)' refs/heads

affiche une ligne pour chaque succursale. Une branche de suivi ressemblera à:

master <- origin/master

un non-tracking ressemblera à:

test <- 
29
répondu Aurelien 2015-06-20 11:34:48

pour la branche courante, vous pouvez aussi dire git checkout (sans n'importe quelle branche). Il s'agit d'une non-op avec des effets secondaires pour montrer l'information de suivi, s'il existe, pour la branche actuelle.

$ git checkout 
Your branch is up-to-date with 'origin/master'.
13
répondu Eugene Yarmash 2014-10-23 10:23:49

j'utilise cet alias

git config --global alias.track '!f() { ([ $# -eq 2 ] && ( echo "Setting tracking for branch "  " -> " ;git branch --set-upstream  ; ) || ( git for-each-ref --format="local: %(refname:short) <--sync--> remote: %(upstream:short)" refs/heads && echo --Remotes && git remote -v)); }; f'

puis

git track
6
répondu Olivier Refalo 2012-04-05 20:36:19

basé sur réponse D'Olivier Refalo

if [ $# -eq 2 ] 
then
    echo "Setting tracking for branch "  " -> " 
    git branch --set-upstream  
else
    echo "-- Local --" 
    git for-each-ref --shell --format="[ %(upstream:short) != '' ] && echo -e '\t%(refname:short) <--> %(upstream:short)'" refs/heads | sh
    echo "-- Remote --" 
    REMOTES=$(git remote -v) 
    if [ "$REMOTES" != '' ]
    then
        echo $REMOTES
    fi  
fi

il n'affiche que local avec piste configurée.

Écrire sur un script appelé git-piste sur votre chemin et vous obtiendrez un git piste commande

une version plus élaborée de https://github.com/albfan/git-showupstream

3
répondu albfan 2017-05-23 12:02:56

git config --get-regexp "branch\.$current_branch\.remote"

vous donnera le nom de la télécommande qui est tracée

git config --get-regexp "branch\.$current_branch\.merge"

, vous obtiendrez le nom de la branche distante qui est suivi.

vous devrez remplacer $current_branch par le nom de votre branche actuelle. Vous pouvez obtenir que dynamiquement avec git rev-parse --abbrev-ref HEAD

le mini-script suivant combine ces choses. Coller dans un fichier nommé "151960920 , le rendre exécutable, et assurez-vous qu'il est dans votre chemin.

alors vous pouvez dire

$ git  tracking
<current_branch_name>-><remote_repo_name>/<remote_branch_name>

notez que le nom de la branche distante peut être différent du nom de votre branche locale (bien que ce ne soit généralement pas le cas). Par exemple:

$git tracking 
xxx_xls_xslx_thing -> origin/totally_bogus

comme vous pouvez le voir dans le code, la clé pour cela est d'extraire les données de la configuration git. J'utilise sed pour effacer les données.

#!/bin/sh

current_branch=$(git rev-parse --abbrev-ref HEAD)
remote=$(git config --get-regexp "branch\.$current_branch\.remote" | sed -e "s/^.* //")
remote_branch=$(git config --get-regexp "branch\.$current_branch\.merge" | \
  sed -e "s/^.* //" -e "s/refs\/.*\///")

echo "$current_branch -> $remote/$remote_branch"
1
répondu masukomi 2017-12-21 22:24:26