570 votes

Votre configuration indique de fusionner avec la branche <nom de la branche> depuis le remote, mais aucun tel ref n'a été récupéré.

Je reçois cette erreur pour pull :

Votre configuration spécifie de fusionner avec la référence 'refs/heads/feature/Sprint4/ABC-123-Branch' depuis le distant, mais aucune telle référence n'a été récupérée.

Cette erreur ne se produit pas pour d'autres branches.
La particularité de cette branche est qu'elle est créée à partir du commit précédent d'une autre branche.

Mon fichier de configuration ressemble à ceci :

[core]
    repositoryformatversion = 0
    filemode = false
    bare = false
    logallrefupdates = true
    symlinks = false
    ignorecase = true
    hideDotFiles = dotGitOnly
[remote "origin"]
    url = 
    fetch = +refs/heads/*:refs/remotes/origin/*
[branch "master"]
    remote = origin
    merge = refs/heads/master
[branch "new-develop"]
    remote = origin
    merge = refs/heads/new-develop
[branch "feature/Sprint4/ABC-123-Branch"]
    remote = origin
    merge = refs/heads/feature/Sprint4/ABC-123-Branch

0 votes

Pouvez-vous partager la commande que vous utilisez pour effectuer la fusion ?

12 votes

Ce problème peut se produire lorsque la branche distante a été supprimée. Vérifiez bien si elle est vraiment là.

27 votes

Lecteurs futurs: Si vous savez que la succursale distante existe, vérifiez si vous ignorez la casse ou non. J'avais configuré une succursale locale pour suivre une succursale distante, mais j'avais tapé le nom de la succursale distante en minuscules. J'ai juste dû reconfigurer le local pour suivre origin/NomDeLaBranche au lieu de origin/nomdelabranche

360voto

torek Points 25463

Ce que cela signifie

Votre amont—le remote que vous appelez origin—n'a plus, ou peut-être n'a jamais eu (il est impossible de le dire uniquement avec ces informations) une branche nommée feature/Sprint4/ABC-123-Branch. Il y a une raison particulièrement courante à cela : quelqu'un (probablement pas vous, sinon vous vous en souviendriez) a supprimé la branche dans cet autre dépôt Git.

Que faire

Cela dépend de ce que vous souhaitez. Voir la section de discussion ci-dessous. Vous pouvez :

  • créer ou recréer la branche sur le remote, ou
  • supprimer votre branche locale, ou
  • faire tout autre chose à laquelle vous pouvez penser.

Discussion

Vous devez exécuter la commande git pull (si vous exécutiez git merge, vous obtiendriez un message d'erreur différent ou pas de message d'erreur du tout).

Lorsque vous exécutez git fetch, votre Git contacte un autre Git, basé sur la ligne url sous la section [remote "origin"] de votre configuration. Ce Git exécute une commande (upload-pack) qui, entre autres choses, envoie votre Git une liste de toutes les branches. Vous pouvez utiliser git ls-remote pour voir comment cela fonctionne (essayez, c'est éducatif). Voici un extrait de ce que j'obtiens en exécutant ceci sur un dépôt Git pour git lui-même :

$ git ls-remote origin
From [url]
bbc61680168542cf6fd3ae637bde395c73b76f0f    HEAD
60115f54bda3a127ed3cc8ffc6ab6c771cbceb1b    refs/heads/maint
bbc61680168542cf6fd3ae637bde395c73b76f0f    refs/heads/master
5ace31314f460db9aef2f1e2e1bd58016b1541f1    refs/heads/next
9e085c5399f8c1883cc8cdf175b107a4959d8fa6    refs/heads/pu
dd9985bd6dca5602cb461c4b4987466fa2f31638    refs/heads/todo
[snip]

Les entrées refs/heads/ listent toutes les branches qui existent sur le remote,1 avec les identifiants de commit correspondants (pour les entrées refs/tags/, les identifiants peuvent pointer vers des objets tag plutôt que des commits).

Votre Git prend chacun de ces noms de branche et les modifie en fonction des lignes fetch dans cette même section remote. Dans ce cas, votre Git remplace refs/heads/master par refs/remotes/origin/master, par exemple. Votre Git fait cela avec chaque nom de branche qui apparaît.

Il enregistre également les noms originaux dans le fichier spécial FETCH_HEAD (vous pouvez voir ce fichier si vous regardez dans votre propre répertoire .git). Ce fichier enregistre les noms et identifiants récupérés.

La commande git pull est prévue comme un raccourci pratique : elle exécute git fetch sur le remote approprié, puis git merge (ou, si nécessaire, git rebase) avec les arguments nécessaires pour effectuer une fusion (ou un rebasage) tel que spécifié dans la section [branch ...]. Dans ce cas, votre section [branch "feature/Sprint4/ABC-123-Branch"] dit de récupérer depuis origin, puis fusionner avec l'ID trouvé sous le nom refs/heads/feature/Sprint4/ABC-123-Branch.

Comme aucun élément n'a été trouvé sous ce nom, git pull se plaint et s'arrête.

Si vous exécutez ceci en deux étapes distinctes, git fetch et ensuite git merge (ou git rebase), votre Git regarderait vos branches distantes de suivi remotes/origin/ pour voir avec quoi fusionner ou sur quoi rebaser. S'il y avait une telle branche à un moment donné, vous pourriez toujours avoir la branche distante de suivi. Dans ce cas, vous ne recevriez pas de message d'erreur. S'il n'y a jamais eu une telle branche, ou si vous avez exécuté git fetch avec --prune (ce qui supprime les branches distantes de suivi inactives), de sorte que vous n'avez aucune branche distante de suivi correspondante, vous recevriez une plainte, mais elle ferait référence à origin/feature/Sprint4/ABC-123-Branch à la place.

Dans tous les cas, nous pouvons conclure que feature/Sprint4/ABC-123-Branch n'existe pas maintenant sur le remote nommé origin.

Elle a probablement existé à un moment donné, et vous avez probablement créé votre branche locale depuis la branche distante de suivi. Si c'est le cas, vous avez probablement toujours la branche distante de suivi. Vous pourriez enquêter pour savoir qui a supprimé la branche du remote, et pourquoi, ou vous pourriez simplement pousser quelque chose pour la recréer, ou supprimer votre branche distante de suivi et/ou votre branche locale.


1Eh bien, tout ce qu'il est prêt à admettre, du moins. Mais à moins qu'ils aient spécifiquement caché quelques refs, la liste comprend tout.

Édition, juil. 2020 : Il y a un nouveau protocole de récupération qui peut éviter de lister tout, et ne lister que les noms que votre Git dit rechercher. Cela peut aider avec les dépôts qui ont un grand nombre de branches et/ou de tags. Cependant, si votre Git est intéressé par tous les noms possibles, vous obtiendrez toujours tous les noms ici.

1 votes

Merci d'avoir expliqué ce que fait réellement la commande git pull. J'ai pu résoudre mon problème en exécutant git fetch puis merge.

51 votes

Pour supprimer les références de branches distantes inexistantes dans votre dépôt local, utilisez git remote prune origin

3 votes

@Ben-Uri : Oui, ou exécutez git fetch --prune origin, ou réglez fetch.prune sur true dans votre configuration (les trois sont censés faire la même chose, bien que dans quelques versions de Git certains de ces paramètres n'étaient pas tout à fait fiables).

235voto

Extreme Points 606

Cela peut également se produire si vous/quelqu'un a renommé la branche. Suivez donc ces étapes (si vous savez que le nom de la branche a été renommé) En supposant que le nom de la branche précédente était wrong-branch-name et que quelqu'un l'a renommé en correct-branch-name. Alors.

git checkout correct-branch-name

git pull (vous verrez cela "Votre configuration spécifie..")

git branch --unset-upstream

git branch --set-upstream-to=origin/correct-branch-name

pour les anciennes versions de git git push --set-upstream origin correct-branch-name

git pull (vous ne recevrez pas le message précédent )

7 votes

Il n'est même pas nécessaire de git push et cela ne fonctionnera pas si la branche actuelle est en retard par rapport à sa version distante. git pull origin nom-de-la-branche-correcte est suffisant.

11 votes

La commande pour définir l'amont est incorrecte ci-dessus. Faites un git pull après l'opération --unset-upstream, dans la sortie du pull vous pouvez voir une erreur, avec la commande pour définir l'amont, comme ci-dessous, git branch --set-upstream-to=origin/ mybranch

0 votes

A bien fonctionné pour moi après avoir supprimé quelques gros fichiers de mon dépôt et avoir dû repousser vers un nouveau dépôt que je viens de créer

61voto

Malhaar Punjabi Points 267

Vérifiez si votre branche distante est disponible pour être tirée. J'ai eu le même problème, j'ai finalement réalisé que la branche distante avait été supprimée par quelqu'un.

6 votes

C'était la même chose pour moi !

8 votes

Après une demande de tirage, le fusionneur (c'est-à-dire la personne qui a effectué la fusion) a la possibilité de supprimer la branche qui a été fusionnée dans la branche cible. Si vous essayez de tirer à ce moment-là, vous obtiendrez cette erreur.

0 votes

C'est vrai :)

8voto

user1747134 Points 1012

J'ai rencontré une erreur similaire lorsque la véritable cause était que mon disque était plein. Après avoir supprimé certains fichiers, git pull a commencé à fonctionner comme je m'y attendais.

1 votes

De même ici - Je suppose que git essaie de récupérer quelque chose du distant, échoue silencieusement à l'écrire parce que le disque est plein, puis ne trouve pas les fichiers et se plaint que le "ref n'a pas été récupéré"?

7voto

Nicola Gallazzi Points 702

Dans mon cas, il me manquait simplement un commit initial sur la branche distante, donc la branche locale ne trouvait rien à tirer et affichait ce message d'erreur.

J'ai fait:

git commit -m 'premier commit' // sur la branche distante
git pull // sur la branche locale

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