aller chercher dans git n'obtient pas toutes les branches

202

J'ai cloné un référentiel, après quoi quelqu'un d'autre a créé une nouvelle branche, sur laquelle j'aimerais commencer à travailler. J'ai lu le manuel, et il semble mort facilement. Étrangement, cela ne fonctionne pas, et tous les messages que j'ai trouvés suggèrent que je fais la bonne chose. Je vais donc me soumettre au fustige, car il doit y avoir quelque chose de mal à l'évidence:

L'action correcte semble être

git fetch
git branch -a
* master
  remotes/origin/HEAD --> origin/master
  remotes/origin/master
git checkout -b dev-gml origin/dev-gml

À ce stade, il y a un problème, pour une raison quelconque, après que git fetchje ne puisse pas voir la branche distante dev-gml. Pourquoi pas? Si je clone le référentiel fraîchement, il est là, donc la branche distante existe certainement:

$ mkdir ../gitest
$ cd ../gitest
$ git clone https://github.com/example/proj.git
Cloning into proj...
remote: Counting objects: 1155, done.
remote: Compressing objects: 100% (383/383), done.
remote: Total 1155 (delta 741), reused 1155 (delta 741)
Receiving objects: 100% (1155/1155), 477.22 KiB | 877 KiB/s, done.
Resolving deltas: 100% (741/741), done.
$ cd projdir
$ git branch -a
* master
  remotes/origin/HEAD -> origin/master
  remotes/origin/dev-gml
  remotes/origin/master

Je l' ai essayé git update, git pull, git fetch --all, git pretty-pleasedans toutes les permutations possibles ...

Edward Newell
la source
45
Que git config --get remote.origin.fetchproduit? Si ce n'est pas le cas +refs/heads/*:refs/remotes/origin/*, cela devrait probablement l'être.
torek
yup c'est exactement ce qu'il produit
Edward Newell
3
Exactement le même problème, mais le commentaire ci-dessus l'a résolu! J'ai eu +refs/heads/master:refs/remotes/origin/masteravec masterau lieu de*
Mirko
1
Même problème pour moi, mais aucune des suggestions de cette page ne le résout. Bizarre.
Magnus
1
@ thoni56: Oui, cela est probablement dû à un clone peu profond.
Trần Việt Hoàng

Réponses:

386

Le problème peut être vu lors de la vérification du remote.origin.fetchparamètre
(les lignes commençant par $sont des invites bash avec les commandes que j'ai tapées. Les autres lignes sont la sortie résultante)

$ git config --get remote.origin.fetch
+refs/heads/master:refs/remotes/origin/master

Comme vous pouvez le voir, dans mon cas, la télécommande a été définie pour extraire la branche principale spécifiquement et uniquement. Je l'ai corrigé comme ci-dessous, y compris la deuxième commande pour vérifier les résultats.

$ git config remote.origin.fetch "+refs/heads/*:refs/remotes/origin/*"
$ git config --get remote.origin.fetch
+refs/heads/*:refs/remotes/origin/*

Le caractère générique *signifie bien sûr tout sous ce chemin.

Malheureusement, j'ai vu ce commentaire après avoir déjà creusé et trouvé la réponse par essais et erreurs.

AndASM
la source
2
Cela devrait probablement être la réponse acceptée, car elle a en fait résolu le problème dans le message d'origine.
LocalPCGuy
1
juste une note latérale, j'ai dû ajouter le --replace-allparamètre pour remplacer toutes les valeurs sur la configuration de monremote.origin.fetch
Garis M Suero
4
Notez que cela peut se produire si vous avez cloné votre référentiel avec une seule branche, par exemplegit clone <url> --branch <branch> --single-branch [<folder>]
Narretz
2
La réponse de vérification Stux
Newbee
5
Cela pourrait arriver lorsque vous git clone ... --depth 1
clonez
107

J'ai eu ce problème aujourd'hui sur un repo.

Ce n'était pas le +refs/heads/*:refs/remotes/origin/*problème selon la meilleure solution.

Le symptôme était simplement que git fetch originou git fetchtout simplement ne semblait rien faire, bien qu'il y ait des branches distantes à récupérer.

Après avoir essayé beaucoup de choses, j'ai retiré la télécommande d'origine et l'ai recréée. Cela semble l'avoir corrigé. Je ne sais pas pourquoi.

supprimer avec: git remote rm origin

et recréer avec: git remote add origin <git uri>

stux
la source
14
J'avais une bonne configuration git pour remote.origin.fetchie +refs/heads/*:refs/remotes/origin/*. La solution ci-dessus m'a aidé.
Newbee
9
Cette solution était aussi la bonne pour moi. C'est dommage car cela indique qu'il y a potentiellement un bug dans Git.
Robert Oschler
2
Cela a également résolu mon problème. Il me semble également que ce problème se produit sur une machine avec la version 2.19.1v de git, mais je ne l'ai pas rencontré sur une autre machine avec la version 2.17.1 de git
jerpint
6
git remote update origintravaillé pour moi. Je suppose que quelque chose devait être rafraîchissant?
Felipe Gerard
2
git remote update originn'a pas fonctionné pour moi, mais le retrait et l'ajout de la télécommande l'ont fait.
Anatoliy Kmetyuk
58

Mise à jour à distance

Vous devez courir

git remote update

ou

git remote update <remote> 

Ensuite, vous pouvez exécuter git branch -rpour répertorier les branches distantes.

Commander une nouvelle succursale

Pour suivre une (nouvelle) branche distante en tant que branche locale:

git checkout -b <local branch> <remote>/<remote branch>

ou (parfois cela ne fonctionne pas sans le supplément remotes/):

git checkout -b <local branch> remotes/<remote>/<remote branch>

Cheatsheets git utiles

philipvr
la source
5
Mais mon problème est que je ne peux pas extraire une branche distante existante , car mon client git ne pense pas qu'elle existe. Voir ma question. Notez que lorsque je cours git fetchsuivi, git branch -ail n'affiche pas toutes les branches. J'ai dû supprimer mon répertoire de travail et re-cloner pour voir la branche dev-gmlcréée par un collaborateur. Cela a fonctionné cette fois, mais nous allons souvent créer des succursales!
Edward Newell
Hé @EdwardNewell, merci pour la réponse, juste pour vous faire savoir, votre lien cheat.errtheblog.com/s/git est mort pour moi ...
Kjellski
Cela fait longtemps que je n'ai pas posé cette question pour la première fois, et je viens de recevoir un ping parce que quelqu'un a posté à nouveau. J'accepte cette réponse, même si à l'origine rien ne fonctionnait réellement pour moi. La raison pour laquelle j'ai finalement marqué ce correct est parce que je soupçonne que ce (s) qu'il a écrit à côté de Edit:très bien aurait pu fonctionner. C'est ce que j'essaierais si j'étais toujours confronté au problème. HTH
Edward Newell
Pour mémoire, le morceau qui m'a aidé ici est git remote update origin. Cela a rendu la branche manquante visible via git branch -l -r. (J'ai regardé git config --get remote.origin.fetchet la sortie était +refs/heads/*:refs/remotes/origin/*comme prévu.)
Robert Dodier
9

l'écrire depuis le terminal

git fetch --prune.

ça fonctionne bien.

Samet ÖZTOPRAK
la source
1
Je vous remercie! J'ai essayé beaucoup de choses et j'ai pensé que j'allais juste tenter le coup ... Maintenant, pour voir ce que j'ai réellement fait ...
MadTurki
Qu'est ce que ça fait?
Adam Orlov
Il prend toutes les branches disponibles. Regardez la tête.
Samet ÖZTOPRAK
4

Pour le rendre plus spécifique Créez une branche de suivi, ce qui signifie que vous suivez maintenant une branche distante.

git branch --track branch remote-branch
git branch --track exp remotes/origin/experimental

Après quoi vous pouvez

git branch   # to see the remote tracking branch "exp" created .

Ensuite, pour travailler sur cette branche, faites

git checkout branchname
git checkout exp

Après avoir apporté des modifications à la branche. Vous pouvez git fetch et git merge avec votre branche de suivi à distance pour fusionner vos modifications et pousser vers la branche distante comme ci-dessous.

git fetch origin
git merge origin/experimental  
git push origin/experimental

J'espère que cela vous aide et vous donne une idée de comment cela fonctionne.

Swapna
la source
1

J'ai eu un problème similaire, mais dans mon cas, je pouvais tirer / pousser vers la branche distante mais je git statusn'ai pas montré l'état de la branche locale par rapport aux distants.

De plus, dans mon cas, je git config --get remote.origin.fetchn'ai rien retourné

Le problème est qu'il y avait une faute de frappe dans le .git/configfichier dans la ligne de récupération du bloc distant respectif. Probablement quelque chose que j'ai ajouté par erreur précédemment (parfois je regarde directement ce fichier, ou même le modifie)

Vérifiez donc si votre entrée à distance dans le .git/config fichier est correcte, par exemple:

[remote "origin"]
    url = https://[server]/[user or organization]/[repo].git
    fetch = +refs/heads/*:refs/remotes/origin/*
Juh_
la source
0

Cela pourrait être dû à un moment de paume du visage: si vous basculez entre plusieurs clones, il est facile de vous retrouver dans la mauvaise arborescence source en essayant de tirer une branche inexistante. C'est plus facile lorsque les clones ont des noms similaires ou que les dépôts sont des clones distincts pour le même projet de chacun des contributeurs multiples. Un nouveau clone git semblerait évidemment résoudre ce "problème" lorsque le vrai problème perd le focus ou le contexte de travail ou les deux.

jerseyboy
la source
0

J'ai dû aller dans mes référentiels distants GitExtensions car rien ici ne semblait fonctionner. Là, j'ai vu que 2 branches n'avaient pas de référentiel distant configuré. après l'ajustement, il ressemble à ceci:entrez la description de l'image ici

La branche de notification noExternal3indique toujours qu'elle n'a pas de référentiel distant. Je ne sais pas quel combo de commandes bash aurait trouvé ou ajusté cela.

Maslow
la source
0

J'ai eu le même problème aujourd'hui lors de la configuration de mon référentiel à partir de zéro. J'ai tout essayé, rien n'a fonctionné, sauf supprimer l'origine et la rajouter à nouveau.

git remote rm origin
git remote add origin [email protected]:web3coach/the-blockchain-bar-newsletter-edition.git

git fetch --all
// Ta daaa all branches fetched
Lukas Lukac
la source
-1

Nous avons eu le même problème et vous devez utiliser

git fetch

git push origin branch_name

git branch -r

J'espère que cela aidera quelqu'un confronté au même problème

chazefate
la source