2393 votes

Comment récupérer toutes les branches de Git

J'ai cloné un dépôt Git, qui contient environ cinq branches. Cependant, lorsque je fais git branch Je ne vois qu'un seul d'entre eux :

$ git branch
* master

Je sais que je peux faire git branch -a pour voir tous les branches, mais comment puis-je tirer toutes les branches localement de sorte que lorsque je fais git branch il affiche ce qui suit ?

$ git branch
* master
* staging
* etc...

1 votes

Également abordé à stackoverflow.com/questions/67699/

3 votes

Cette question montre comment obtenir toutes les branches après avoir utilisé la fonction --single-branch lors du clonage : stackoverflow.com/questions/17714159/ ( git fetch --all ne fonctionnera jamais si vous n'avez spécifié qu'une seule branche !)

3 votes

Vous ne verrez jamais cette sortie car l'astérisque représente la branche qui est actuellement en cours de vérification. Comme vous ne pouvez avoir qu'une seule branche extraite à la fois, vous ne pouvez avoir qu'un seul astérisque à gauche de votre liste de branches.

3155voto

Wookie88 Points 2079

Réponse abrégée

git branch -r | grep -v '\->' | sed "s,\x1B\[[0-9;]*[a-zA-Z],,g" | while read remote; do git branch --track "${remote#origin/}" "$remote"; done
git fetch --all
git pull --all

(Il semble que pull récupère toutes les branches de tous les remotes, mais je récupère toujours en premier juste pour être sûr).

Exécutez la première commande uniquement s'il existe des branches distantes sur le serveur qui ne sont pas suivies par vos branches locales.

Réponse complète

Vous pouvez récupérer toutes les branches de toutes les télécommandes comme ceci :

git fetch --all

Il s'agit essentiellement d'un mouvement de puissance .

fetch met à jour les copies locales des branches distantes, ce qui est toujours sûr pour vos branches locales. MAIS :

  1. fetch ne sera pas mise à jour les succursales locales (qui piste branches distantes) ; si vous voulez mettre à jour vos branches locales, vous devez toujours tirer chaque branche.

  2. fetch ne sera pas créer les succursales locales (qui piste branches distantes), vous devez le faire manuellement. Si vous voulez lister toutes les branches distantes : git branch -a

A mise à jour les branches locales qui suivent les branches distantes :

git pull --all

Toutefois, cela peut être encore insuffisant. Elle ne fonctionnera que pour vos branches locales qui suivent les branches distantes. Pour suivre toutes les branches distantes, exécutez cet oneliner AVANT git pull --all :

git branch -r | grep -v '\->' | sed "s,\x1B\[[0-9;]*[a-zA-Z],,g" | while read remote; do git branch --track "${remote#origin/}" "$remote"; done

P.S. AFAIK git fetch --all y git remote update sont équivalentes.



Kamil Szot commentaire que les gens ont trouvé utile.

J'ai dû utiliser :

for remote in `git branch -r`; do git branch --track ${remote#origin/} $remote; done

parce que votre code a créé des branches locales nommées origin/branchname et j'obtenais le message "refname 'origin/branchname' is ambiguous" à chaque fois que je faisais que j'y faisais référence.

50 votes

Désolé. Je ne peux pas imaginer que c'est ce que le PO veut réellement. La commande 'pull' est 'fetch+merge' et la partie 'merge' va superposer toutes les branches les unes sur les autres - laissant un désordre géant.

13 votes

Que fetch ne crée pas une nouvelle branche distante, vous devez quand même la vérifier avec git checkout -b localname remotename/remotebranch

0 votes

Est-ce que git fetch récupère les changements de toutes les branches que je suis ? ou je dois être sur la branche que je veux récupérer, et les autres changements ne seront pas récupérés pour les autres branches suivies ? (si cela a un sens)

1295voto

Learath2 Points 2430

Pour lister les branches distantes :

git branch -r

Vous pouvez les consulter en tant que succursales locales avec :

git checkout -b LocalName origin/remotebranchname

161 votes

C'est exactement ce que je cherchais lorsque j'ai trouvé la question ci-dessus. Je soupçonne que beaucoup de personnes cherchant comment tirer une branche distante ne veulent certainement pas fusionner la branche dans leur copie de travail actuelle, mais ils veulent une branche locale identique à la branche distante.

35 votes

Même si la branche n'est pas visible localement, je peux faire git checkout remotebranchname et ça marche. quelle est la différence avec votre solution ?

28 votes

Son comportement par défaut maintenant. Ce n'était pas le cas sur les anciennes versions de git. Utilisation de git checkout remotebranchname permettait de créer simplement une nouvelle sans rapport qui est nommé remotebranchname .

224voto

Michael Renner Points 232

Vous devrez créer des branches locales en suivant les branches distantes.

En supposant que vous n'ayez qu'une seule télécommande appelée origin cet extrait créera des branches locales pour toutes les branches de suivi à distance :

for b in `git branch -r | grep -v -- '->'`; do git branch --track ${b##origin/} $b; done

Après ça, git fetch --all mettra à jour toutes les copies locales des branches distantes.

Aussi, git pull --all mettra à jour vos branches de suivi locales, mais en fonction de vos commits locaux et de la façon dont l'option de configuration 'merge' est définie, il peut créer un commit de fusion, avancer rapidement ou échouer.

6 votes

Cela rend la solution robuste contre les noms de branches contenant des métacaractères de l'interpréteur de commandes (selon le commentaire de pinkeen sur l'autre réponse), et évite les fausses erreurs : git branch -r | grep -v -- ' -> ' | while read remote ; do git branch --track "${remote#origin/}" "$remote" 2>&1 | grep -v ' already exists' ; done

11 votes

Etes-vous sûr que git pull --all mettra à jour toutes les branches de suivi locales ? D'après ce que je sais, il ne met à jour que la branche actuelle de toutes les branches distantes.

4 votes

J'ai fait ça. Les branches locales correspondant aux branches distantes n'ont pas été créées. Quelle est la commande git qui dit simplement "tirer toutes les branches distantes en créant des branches locales si elles n'existent pas" ?

176voto

GoZoner Points 15679

Si vous le faites :

git fetch origin

alors ils seront tous là localement. Si vous vous produisez alors :

git branch -a

vous les verrez listés comme remotes/origin/branch-name. Puisqu'ils sont là localement, vous pouvez faire ce que vous voulez avec eux. Par exemple :

git diff origin/branch-name 

ou

git merge origin/branch-name

ou

git checkout -b some-branch origin/branch-name

6 votes

Je viens de trouver cette page sur google... c'est le type même de réponse que je cherchais. J'ai essayé la première commande mais j'ai reçu une erreur : [$ git fetch --all origin fatal : fetch --all does not take a repository argument] --- Utiliser "git fetch --all" semble faire l'affaire. Merci pour la piste !

1 votes

Fixe (éliminé --all )

20 votes

git fetch -all récupère toutes les branches de tous les remotes. git fetch origin récupère toutes les branches du fichier distant origin . C'est cette dernière qui est demandée par le PO.

140voto

John Nolan Points 16633
$ git remote update
$ git pull --all

Cela suppose que toutes les branches sont suivies.

Si ce n'est pas le cas, vous pouvez le renvoyer dans Bash :

for remote in `git branch -r `; do git branch --track $remote; done

Ensuite, exécutez la commande.

4 votes

Lorsque j'essaie cela, j'obtiens toujours le même résultat que ci-dessus.

5 votes

Comme @JacobLowe, j'ai eu l'erreur, mais ça a quand même fonctionné ; 'fatal : A branch named 'origin/master' already exists'.

0 votes

C'est moche car cela va essayer de créer une branche pour -> qui existera probablement dans la sortie de git branch -r comme ` origin/HEAD -> origin/master`

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