1049 votes

Comment puis-je voir quelles branches Git suivent quelle branche distante / amont?

Je sais que je peux faire git branch --all, et cela me montre les branches 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 branche distante ?

1479voto

Jefromi Points 127932

Commande très porcelaine, pas bon si vous voulez l'utiliser pour le scripting:

git branch -vv   # doublement verbeux!

Notez qu'avec git 1.8.3, cette branche upstream est affichée en bleu (voir "Quelle est cette branche qui suit (si elle suit quelque chose) dans git?")


Si vous voulez une sortie propre, consultez la réponse de Carl Suster - elle utilise une commande porcelaine qui, je ne crois pas, existait à l'époque où j'ai écrit cette réponse initiale, elle est donc un peu plus concise et fonctionne avec les branches configurées pour le rebase, pas seulement la fusion.

3 votes

La première méthode ci-dessus ne me fournit pas les informations souhaitées. Le deuxième... semble excessif, surtout que la réponse de Kubi fonctionne. Est-ce que j'oublie quelque chose?

4 votes

@garyp Vous n'êtes pas celui qui a posé la question. Le premier a fourni ce dont l'OP avait besoin, et le second a fourni exactement ce dont il avait besoin, au cas où il voulait le garder en forme propre pour le scripting, ou le sauvegarder simplement en tant qu'alias. ("Overkill" est acceptable si cela vous donne ce que vous voulez et que vous n'avez pas à le répéter.) Du point de vue de cette question, la réponse de kubi fournit des informations superflues, et s'il y a plus d'une distance, elle ne montre pas tout, mais si cela répond à vos besoins, n'hésitez pas à l'utiliser.

3 votes

Je dois des excuses. Lorsque j'ai initialement exécuté la première méthode, je n'ai obtenu aucune information sur ce qui suit quoi, et j'aurais dû le mentionner explicitement. Mais maintenant, je vois les informations de suivi, donc il devait y avoir quelque chose qui clochait avec ma configuration. Donc, je manquais quelque chose.

350voto

kubi Points 20607

git remote show origin

Remplacez 'origin' par le nom de votre distant.

19 votes

Même si cette commande en porcelaine fonctionne plus ou moins pour un être humain (pas tellement pour un script, car il devrait analyser la sortie en porcelaine), ce que je n'aime pas dans cette approche, c'est que la commande git remote show se connecte en fait au dépôt distant ... et donc elle échoue si vous êtes hors ligne ou incapable de vous connecter au dépôt pour une raison quelconque...

28 votes

@pvandenberk Vous pouvez utiliser git remote show -n origin pour obtenir des informations même en mode hors ligne. À partir de la documentation sur les dépôts distants de git : "Avec l'option -n, les têtes distantes ne sont pas d'abord interrogées avec git ls-remote ; des informations mises en cache sont utilisées à la place."

8 votes

Une chose étrange à propos de cette commande : elle répertorie les branches distantes comme "suivies", même s'il n'y a pas de branche locale configurée pour pull/push. Je trouve cela toujours déroutant. En fait, je ne suis pas clair sur ce que "suivi" est censé signifier dans cette sortie. La documentation Git sur le sujet laisse entendre qu'une branche distante est "suivie" uniquement lorsqu'elle est liée à une branche locale pour push/pull...

153voto

arcresu Points 1702

Si vous regardez la page de l'homme pour git-rev-parse, vous verrez que la syntaxe suivante est décrite:

@{upstream}, par exemple master@{upstream}, @{u}

Le suffixe @{upstream} à un nom de branche (forme courte @{u}) fait référence à la branche sur laquelle la branche spécifiée par le nom de la branche est configurée pour se construire dessus. Un nom de branche manquant par défaut à celui en cours.

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

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

Pour afficher les informations 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 suit $upstream
  else
    echo $branch n'a pas d'amont configuré
  fi
done < <(git for-each-ref --format='%(refname:short)' refs/heads/*)

# Sortie:
# master suit origin/master
# ...

C'est plus propre que d'analyser manuellement les références et la configuration.

0 votes

Je n'ai pas pu comprendre ce morceau dans rev-parse malgré l'avoir trouvé, donc merci pour l'explication claire!

4 votes

Pour ceux d'entre nous utilisant git-flow, avec des branches nommées "feature/blahblah", l'instruction de fermeture de la boucle while devrait être : done < <(git for-each-ref --format='%(refname:short)' refs/heads/**) Notez les deux astérisques à la fin du modèle glob.

10 votes

git rev-parse --abbrev-ref HEAD@{upstream} semble fonctionner parfaitement pour la branche actuelle. Cela fait également un bel alias git.

95voto

Abizern Points 52378

Une alternative à la réponse de kubi est de jeter un coup d'œil au fichier .git/config qui montre la configuration du dépôt local :

cat .git/config

9 votes

Aussi git config --get-regex branch

8 votes

Ou, plus spécifiquement, 'git config --get-regexp branch.*merge'

0 votes

Donc en gros, une branche a un amont si branch.NAME.remote et branch.NAME.merge sont définis...

42voto

cdunn2001 Points 3597

Pour la branche actuelle, voici deux bonnes options :

% 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 également ici, pour une question légèrement différente qui a été (à tort) marquée comme un doublon.

6 votes

En fonction de cela, toutes les branches peuvent être répertoriées de manière conviviale pour le script : git for-each-ref --shell --format='%(refname:short) %(upstream:short)' refs/heads.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X