web-dev-qa-db-fra.com

Comment savoir quelles branches git suivent quelle branche distante/en amont?

Je sais que je peux faire git branch --all et cela me montre les succursales locales et distantes, mais ce n'est pas très utile pour me montrer les relations entre elles.

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

664
joachim

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

git branch -vv   # doubly verbose!

Notez qu'avec git 1.8.3, cette branche en amont est affichée dans blue (voir " Quel est ce suivi de branche (le cas échéant) dans git? ")


Si vous voulez une sortie nette, voir réponse d'Arcresu - il utilise une commande de porcelaine qui, à mon avis, n'existait pas à l'époque où j'ai écrit cette réponse. juste fusionner.

924
Cascabel

git remote show Origin

Remplacez 'Origine' par le nom de votre télécommande.

205
kubi

Si vous consultez la page de manuel relative à 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}) fait référence à la branche spécifiée par la branche branchname est configuré pour construire au-dessus de. Un nom de branche manquant par défaut à l'actuel.

Par conséquent, pour trouver l’amont de la branche master, vous feriez:

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

Pour imprimer les informations pour chaque branche, vous pouvez 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 d'analyser manuellement les références et les configurations.

85
Carl Suster

Une alternative à la réponse de kubi est de consulter le fichier .git/config qui montre la configuration du référentiel local:

cat .git/config

75
Abizern

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 en double.

34
cdunn2001
git for-each-ref --format='%(refname:short) <- %(upstream:short)' refs/heads

montrera une ligne pour chaque branche locale. Une branche de suivi ressemblera à:

master <- Origin/master

Un non suivi va ressembler à:

test <- 
32
Aurelien

Pour la branche actuelle, vous pouvez également dire git checkout (sans branche). Il s'agit d'un no-op avec des effets secondaires pour afficher les informations de suivi, le cas échéant, pour la branche actuelle.

$ git checkout 
Your branch is up-to-date with 'Origin/master'.
14
Eugene Yarmash

J'utilise cet alias

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

puis

git track
6
Olivier Refalo

Basé sur Réponse d'Olivier Refalo

if [ $# -eq 2 ] 
then
    echo "Setting tracking for branch " $1 " -> " $2
    git branch --set-upstream $1 $2
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 montre seulement local avec piste configurée.

Ecrivez-le sur un script appelé git-track sur votre chemin et vous obtiendrez une commande git track

Une version plus élaborée sur https://github.com/albfan/git-showupstream

3
albfan

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

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

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

vous donnera le nom de la branche distante suivie. 

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

Le mini-script suivant combine ces éléments. Collez-le dans un fichier nommé git-tracking, rendez-le exécutable et assurez-vous qu'il se trouve 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 de celui de votre branche locale (bien qu'il ne le soit généralement pas). Par exemple:

$git tracking 
xxx_xls_xslx_thing -> Origin/totally_bogus

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

#!/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
masukomi

En voici un net et simple. Peut vérifier git remote -v, qui vous montre toute l'origine et en amont de la branche actuelle.

1
MJeremy