188 votes

Git rebase fatal: Il fallait une seule révision

J'ai une branche d'un dépôt public et j'essaie de mettre à jour ma branche avec les commits actuels du dépôt d'origine :

$ git fetch 
remote: Counting objects: 24, done.
remote: Compressing objects: 100% (20/20), done.
remote: Total 20 (delta 12), reused 0 (delta 0)
Unpacking objects: 100% (20/20), done.
From git://github.com/path_to/repo
  9b70165..22127d0  master     -> $/master
$ git rebase 
fatal: Needed a single revision
invalid upstream 

Le se trouve à la place de mon nom de remote et n'est pas mon nom de remote en réalité. La documentation sur cette erreur semble être un peu vague.

2 votes

J'ai obtenu cette erreur pour une raison non liée - en utilisant "git rebase --interactive c4e9c94^" à partir d'une invite de commande Windows. Il m'a demandé "More?", et indépendamment de la façon dont j'ai répondu à la demande, il a dit "fatal: needed a single revision". Mais lorsque j'ai exécuté la même commande à partir de bash, cela a fonctionné correctement.

0 votes

En tant qu'observation, en plus d'avoir la branche amont répertoriée avec "remote", j'ai dû récupérer la branche spécifique sur laquelle je voulais rebaser. "git fetch master". Récupérer juste avec "git fetch " me donnait toujours cette erreur.

159voto

Charles Bailey Points 244082

Vous devez fournir le nom d'une branche (ou un autre identifiant de commit), pas le nom d'un remote à git rebase.

Par exemple:

git rebase origin/master

pas:

git rebase origin

Notez que, bien que origin devrait résoudre la référence origin/HEAD lorsqu'il est utilisé comme argument où une référence de commit est requise, il semble que tous les dépôts n'obtiennent pas une telle référence, donc cela peut ne pas fonctionner (comme dans votre cas). Il est préférable d'être explicite.

2 votes

Le dernier devrait en réalité fonctionner - origin dans le contexte de référence est interprété comme origin/HEAD. J'ai vu des dépôts ne pas savoir ce qu'est origin/HEAD, cependant...

1 votes

@Jefromi: J'ai peur de ne pas te croire, je viens juste d'essayer git rebase origin sur un dépôt de test (où origin a un HEAD) et j'obtiens l'erreur de l'OP. La documentation pour rebase ne mentionne pas qu'un nom de remote est valide pour le .

1 votes

@Charles: Eh bien, cela peut être un bug? git rev-parse origin fonctionne, tout comme git rebase origin dans mon clone git.git (dans le cas de la remise à jour, rapide et correcte, y compris interactive).

32voto

ChrisJF Points 657

Vérifiez que vous avez bien orthographié le nom de la branche. J'étais en train de rebase une branche de story (c'est-à-dire branch_name) et j'ai oublié la partie de l'histoire. (c'est-à-dire story/branch_name) et git m'a alors renvoyé cette erreur qui n'avait pas beaucoup de sens dans ce contexte.

0 votes

Exactement cela. Tapez featureName lorsque la branche est en réalité nommée features/featureName

4 votes

Aussi une bonne idée de chercher les fautes de frappe simples plus minutieusement. J'ai accidentellement échangé deux lettres en créant une branche et cette faute de frappe était vraiment difficile à repérer.

29voto

Mario Flores Points 150

Je suis tombé sur fatal: Needed a single revision et j'ai réalisé que je n'avais pas récupéré la source en amont avant d'essayer de rebaser. Tout ce que je devais faire était de d'abord faire un git fetch upstream.

11voto

Maitreya Points 61

Le problème est que vous avez créé une ramification d'une autre ramification... vers laquelle vous essayez de rebaser. Vous ne pouvez pas rebaser vers une branche qui ne contient pas le commit sur lequel votre branche actuelle a été initialement créée.

J'ai rencontré ce problème lorsque j'ai d'abord rebasé une branche locale X sur une branche poussée Y, puis j'ai essayé de rebaser une branche (initialement créée sur X) sur la branche poussée Y.

Pour moi, le problème a été résolu en rebasant sur X.

Je n'ai aucun problème à rebaser sur des branches distantes (éventuellement même non vérifiées), à condition que ma branche actuelle soit issue d'un ancêtre de cette branche.

3 votes

Vous pouvez refaire le basculement sur une telle branche avec --onto. Tout descend d'un ancêtre commun (pour les dépôts normaux), donc ce n'est pas le problème. J'ai obtenu cette erreur en essayant de refaire le basculement sur foo alors que je n'avais pas encore créé la branche pour suivre origin/foo.

1voto

Jani Points 396

L'erreur se produit lorsque votre dépôt n'a pas défini la branche par défaut pour le remote. Vous pouvez utiliser la commande git remote set-head pour modifier la branche par défaut, et ainsi être en mesure d'utiliser le nom du remote au lieu d'une branche spécifiée dans ce remote.

Pour interroger le remote (dans ce cas origin) pour son HEAD (généralement master), et définir cela comme la branche par défaut :

$ git remote set-head origin --auto

Si vous souhaitez utiliser une autre branche distante par défaut localement, vous pouvez spécifier cette branche :

$ git remote set-head origin new-default

Une fois la branche par défaut définie, vous pouvez simplement utiliser le nom du remote dans git rebase et d'autres commandes au lieu de / explicite.

En coulisses, cette commande met à jour la référence dans .git/refs/remotes/origin/HEAD.

$ cat .git/refs/remotes/origin/HEAD 
ref: refs/remotes/origin/master

Consultez la page de manuel de git-remote pour plus de détails.

0 votes

@VladimirShefer a réécrit toute la réponse pour utiliser git remote set-head au lieu de bidouiller directement avec .git/refs/remotes/origin/HEAD.

0 votes

Aussi, je pense que cela répond mieux à la question originale que la réponse acceptée, qui n'est qu'une solution de contournement à la cause principale.

0 votes

Merci pour votre réponse. C'est bien mieux maintenant! J'ai supprimé mon vote négatif.

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