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.
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
0 votes
Je viens juste de rencontrer cette erreur et le problème était bien plus simple que les réponses ci-dessous, j'avais perdu ma connexion VPN. Donc c'est aussi l'erreur que vous obtenez si git ne peut pas accéder au serveur distant d'origine.
0 votes
Mon serveur Git était hors service. C'est la cause.
0 votes
Je viens de vérifier la branche principale et ça a résolu le problème.
2 votes
Avec des solutions impliquant l'élagage des branches locales pour correspondre aux branches distantes, assurez-vous d'abord que vous n'êtes pas vraiment sur la branche supprimée localement, et surtout que vous n'avez pas de modifications non validées sur cette branche.
2 votes
Il y a d'excellentes réponses fournies, donc pas besoin d'ajouter de nouvelles réponses. Mais selon moi, quand je reçois ce message, cela signifie que la branche d'origine a été supprimée, généralement parce qu'elle a été supprimée lorsqu'elle a été fusionnée dans une autre branche. C'est une pratique courante pour maintenir le repo d'origine dépourvu d'encombrement des anciennes branches.
0 votes
Cela vient de m'arriver, Github a supprimé ma branche lors de la fusion (cette fusion a été faite en utilisant le site Web, alors que j'utilise habituellement le programme en ligne de commande gh), comme @BennyNeugebauer le souligne, assurez-vous que la branche n'est pas supprimée sur le serveur distant.
2 votes
Comme @angryITguy l'a mentionné, cela est probablement dû au fait que la branche a été supprimée (pour garder les choses en ordre) lorsqu'elle a été fusionnée dans la branche principale. Par exemple, GitLab encourage cela avec une case à cocher sur la page de fusion. Vous pouvez voir si la branche a été fusionnée sur stackoverflow.com/questions/226976/…. Donc en utilisant git branch --merged master. Si elle a effectivement été fusionnée, tout va bien; effacez le message d'erreur avec git branch --set-upstream-to=origin/master