Comment répertorier toutes les branches distantes dans Git 1.7+?

635

J'ai essayé git branch -r, mais cela ne répertorie que les branches distantes que j'ai suivies localement. Comment trouver la liste de ceux que je n'ai pas? (Peu importe que la commande répertorie toutes les branches distantes ou uniquement celles qui ne sont pas suivies.)

James A. Rosen
la source
11
Vous voulez dire que vous avez modifié la spécification par défaut, de sorte que git fetchet git remote updatene récupérez pas toutes les branches de la télécommande? Parce que sinon, vous pouvez simplement chercher puis utiliser git branch -r...
Cascabel
2
Je dois avoir. git branch -rme montrait seulement des branches éloignées que j'avais suivies localement. Ça fonctionne mieux maintenant.
James A. Rosen

Réponses:

805

Pour la grande majorité [1] des visiteurs ici, la réponse correcte et la plus simple à la question "Comment lister toutes les branches distantes dans Git 1.7+?" est:

git branch -r

Pour une petite minorité [1] git branch -r ne fonctionne pas. Sigit branch -r cela ne fonctionne pas, essayez:

git ls-remote --heads <remote-name>

Si git branch -rcela ne fonctionne pas, alors peut-être que Cascabel dit « vous avez modifié le refspec par défaut, de sorte que git fetchet git remote updatene va pas chercher toutes les remotebranches d » » .


[1] Au moment de la rédaction de cette note de bas de page 2018-février, j'ai regardé les commentaires et constaté que les git branch -rtravaux pour la grande majorité (environ 90% ou 125 sur 140 ).

Si git branch -rcela ne fonctionne pas, la vérification git config --get remote.origin.fetchcontient un caractère générique (* ) selon cette réponse

Dustin
la source
15
Vous pouvez également le faire git ls-remote [url], vous n'avez pas à le cloner d'abord :)
Zsub
142
Cette réponse est correcte mais trompeuse, la première chose que les utilisateurs venant des moteurs de recherche devraient voir est: git branch -rpuisque c'est la réponse correcte et la plus simple, le demandeur a eu un cas particulier où il a modifié le comportement de la git branch -rplupart des utilisateurs qui viennent ici ne le verront pas avoir
Stephan
24
@Stephan: en êtes-vous sûr? git branch -rn'a pas non plus fonctionné pour moi. Il s'agit simplement de répertorier les succursales déjà suivies localement. Mais git ls-remote --headsrépertorié toutes les branches disponibles sur le référentiel distant ...
Rexford
2
Si l'on veut extraire des branches répertoriées via git ls-remote(et non répertoriées sur git branch -r), il faut exécuter git config remote.origin.fetch "+refs/heads/*:refs/remotes/origin/*"avant de récupérer comme décrit sur stackoverflow.com/a/26649770/873282 .
koppor
11
N'oubliez pas de faire git fetch --allavant d'obtenir toutes les branches distantes actuelles.
A. Attia
174

remote show affiche toutes les branches de la télécommande, y compris celles qui ne sont pas suivies localement et même celles qui n'ont pas encore été récupérées.

git remote show <remote-name>

Il essaie également d'afficher l'état des branches par rapport à votre référentiel local:

> git remote show origin
* remote origin
  Fetch URL: C:/git/.\remote_repo.git
  Push  URL: C:/git/.\remote_repo.git
  HEAD branch: master
  Remote branches:
    branch_that_is_not_even_fetched new (next fetch will store in remotes/origin)
    branch_that_is_not_tracked      tracked
    branch_that_is_tracked          tracked
    master                          tracked
  Local branches configured for 'git pull':
    branch_that_is_tracked merges with remote branch_that_is_tracked
    master                 merges with remote master
  Local refs configured for 'git push':
    branch_that_is_tracked pushes to branch_that_is_tracked (fast-forwardable)
    master                 pushes to master                 (up to date)
Klas Mellbourn
la source
Exactement. Non récupéré, non suivi localement.
Thufir
3
branch_that_is_not_tracked tracked?
Piotr Dobrogost
3
@PiotrDobrogost Oui! branch_that_is_not_trackedest une branche qui n'est suivie par aucune branche git locale. Cependant, il a été récupéré dans le référentiel local (il existe donc une branche distante). Pour une raison étrange, git remote showcet état est appelé tracked, même s'il n'y a pas de branche locale qui suit la télécommande. Dans ce cas, l'opposé de trackedis newsignifie "non récupéré".
Klas Mellbourn
cela ne fonctionne pas par programme, trop difficile à analyser
Alexander Mills
Cela a attrapé un cas spécial que j'ai eu où j'avais tiré une branche distante localement qui avait ensuite été supprimée sur la télécommande. Ensuite , git branch -rsuggère qu'il ya une branche éloignée encore, mais git remote show originmontre que refs/remotes/origin/my-now-dead-branch stale (use 'git remote prune' to remove). Beaucoup plus utile!
icc97
54
git branch -a | grep remotes/*
Idan K
la source
10
C'est fondamentalement équivalent à git branch -r, ce que le PO a dit ne pas être assez bon.
Cascabel
9
en fait les deux git branch -aet git branch -rlistez toutes les branches distantes pour moi, je ne sais pas si ce que l'OP a dit est vrai. Je viens de configurer un référentiel de test et de le vérifier (il n'y avait que master tracking origin / master mais j'ai toujours vu toutes les branches distantes avec les deux drapeaux).
Idan K
2
semble que cela ne répertorie pas toutes les branches distantes si je clone à partir d'un référentiel extrait existant, puis pointez manuellement l'origine vers le serveur git. La réponse acceptée traite ce cas.
nielsbot
Cette solution ne semble pas répertorier les branches distantes créées depuis ma dernière extraction.
Anubian Noob
La chose étrange: pendant des années, j'ai git fetchsuivi git branch -a, ce qui n'a commencé que récemment à échouer pour moi. Peut-être que le comportement de Git a été changé?
Sebastian Mach
39

L'utilisation git branch -rrépertorie toutes les branches distantes et git branch -arépertorie toutes les branches locales et distantes. Ces listes deviennent cependant obsolètes. Pour maintenir ces listes à jour, exécutez

git remote update --prune

qui mettra à jour votre liste de succursales locales avec toutes les nouvelles de la télécommande et supprimera celles qui ne sont plus là. L'exécution de cette commande de mise à jour sans --prune récupérera de nouvelles branches mais ne supprimera plus celles qui ne se trouvent plus sur la télécommande.

Vous pouvez accélérer cette mise à jour en spécifiant une télécommande, sinon elle extraira les mises à jour de toutes les télécommandes que vous avez ajoutées, comme ceci

git remote update --prune origin
Nick Gronow
la source
Cela a résolu mon problème - 'git branch -r' fonctionne maintenant pour moi.
Francis Norton
27

Mais

git branch -ar

devrait le faire.

Seakayone
la source
41
La transmission des deux arguments est redondante. -rrenvoie uniquement les branches distantes. -arenvoie les succursales locales et distantes. Ainsi, git branch -aet les git branch -ardeux produisent la même sortie.
Walter Roman
19

Vous pouvez également faire git fetchsuivi d'un git branch -r. Sans chercher, vous ne verrez pas les branches les plus récentes.

Max Sohrt
la source
git fetch --allavoir toutes les succursales actuelles
A. Attia
19

Branchement Git - Branches distantes

git ls-remote

Documentation Git .

Michael Horojanski
la source
git ls-remote --heads pour obtenir des résultats plus précis
Wolfgang Fahl
1
Ceci est la seule commande qui répertorie aussi ma branche , je accidentellement sans poussais heads/en refs/heads/features/my-branch, merci!
msa
9

Le moyen le plus simple que j'ai trouvé:

git branch -a
Damián Rafael Lattenero
la source
9

TL; TR;

Voici la solution de votre problème:

git remote update --prune    # To update all remotes
git branch -r                # To display remote branches

ou:

git remote update --prune    # To update all remotes
git branch <TAB>             # To display all branches
simhumileco
la source
5

La meilleure commande à exécuter est git remote show [remote] . Cela montrera toutes les succursales, distantes et locales, suivies et non suivies.

Voici un exemple d'un projet open source:

> git remote show origin
* remote origin
  Fetch URL: https://github.com/OneBusAway/onebusaway-android
  Push  URL: https://github.com/OneBusAway/onebusaway-android
  HEAD branch: master
  Remote branches:
    amazon-rc2                   new (next fetch will store in remotes/origin)
    amazon-rc3                   new (next fetch will store in remotes/origin)
    arrivalStyleBDefault         new (next fetch will store in remotes/origin)
    develop                      tracked
    master                       tracked
    refs/remotes/origin/branding stale (use 'git remote prune' to remove)
  Local branches configured for 'git pull':
    develop merges with remote develop
    master  merges with remote master
  Local refs configured for 'git push':
    develop pushes to develop (local out of date)
    master  pushes to master  (up to date)

Si nous voulons simplement obtenir les branches distantes, nous pouvons les utiliser grep. La commande que nous voudrions utiliser serait:

grep "\w*\s*(new|tracked)" -E

Avec cette commande:

> git remote show origin | grep "\w*\s*(new|tracked)" -E
    amazon-rc2                   new (next fetch will store in remotes/origin)
    amazon-rc3                   new (next fetch will store in remotes/origin)
    arrivalStyleBDefault         new (next fetch will store in remotes/origin)
    develop                      tracked
    master                       tracked

Vous pouvez également créer un alias pour cela:

git config --global alias.branches "!git remote show origin | grep \w*\s*(new|tracked) -E"

Ensuite, vous pouvez simplement courir git branches.

Anubian Noob
la source
5

Essaye ça...

git fetch origin
git branch -a
Ashish Mehta
la source
4

Exécutez simplement une git fetchcommande. Il tirera toutes les branches distantes vers votre référentiel local, puis fera une git branch -aliste de toutes les branches.

Manjunatha B
la source
1

S'il y a une branche distante dont vous savez qu'elle doit être répertoriée, mais qu'elle n'est pas répertoriée, vous pouvez vérifier que votre origine est correctement configurée avec ceci:

git remote show origin

Si tout va bien, vous devriez peut-être exécuter une mise à jour:

git remote update

En supposant que cela fonctionne correctement, vous devriez pouvoir faire ce que disent les autres réponses:

git branch -r
ArtOfWarfare
la source
1

En utilisant cette commande,

git log -r --oneline --no-merges --simplify-by-decoration --pretty=format:"%n %Cred CommitID %Creset: %h %n %Cred Remote Branch %Creset :%d %n %Cred Commit Message %Creset: %s %n"

CommitID       : 27385d919
Remote Branch  : (origin/ALPHA)
Commit Message :  New branch created

Il répertorie toutes les branches distantes, y compris les messages de validation et les ID de validation auxquels se réfèrent les branches distantes.

Nayagam
la source
1

J'utiliserais:

git branch -av

Cette commande vous montre non seulement la liste de toutes les branches, y compris les branches distantes commençant par /remote, mais elle vous fournit également des *commentaires sur ce que vous avez mis à jour et les derniers commentaires de validation.

prosti
la source
0

Assurez-vous que l'origine distante que vous répertoriez est bien le référentiel que vous souhaitez et non un clone plus ancien.

user3737174
la source
0

J'ai fini par faire un pipeline shell mess pour obtenir ce que je voulais. Je viens de fusionner les branches de la télécommande d'origine:

git branch -r --all --merged \
    | tail -n +2 \
    | grep -P '^  remotes/origin/(?!HEAD)' \
    | perl -p -e 's/^  remotes\/origin\///g;s/master\n//g'
ThorSummoner
la source
0

La réponse acceptée fonctionne pour moi. Mais j'ai trouvé plus utile de trier les commits en commençant par les plus récents.

git branch -r --sort=-committerdate

https://git-scm.com/docs/git-branch

Gabriel Gates
la source