J'ai un dépôt git qui suit plusieurs branches distantes:
$ git branch -a
* master
remotes/git-svn
remotes/Origin/master
remotes/trunk
Lorsque j'essaie d'en configurer une par défaut, j'obtiens l'erreur suivante:
$ git branch --set-upstream-to=Origin/master master
warning: refname 'Origin/master' is ambiguous.
fatal: Ambiguous object name: 'Origin/master'.
Je voudrais supprimer certaines des branches maître distantes mais les références maître sont toujours là. Comment puis-je les supprimer pour pouvoir définir la branche amont par défaut sur Origin/master
?
$ git show-ref master
cba97a58c99743c355b569bbf35636c8823c2d96 refs/heads/master
6726b4985107e2ddc7539f95e1a6aba536d35bc6 refs/Origin/master
d83f025cd3800ed7acd76b2e52ae296e33f1cd07 refs/original/refs/heads/master
cba97a58c99743c355b569bbf35636c8823c2d96 refs/remotes/Origin/master
La sortie de git branch -a
indique que vous disposez d'une branche de suivi à distance appelée Origin/master
. Parfaitement normal.
Cependant, la sortie de git show-ref master
contient
6726b4985107e2ddc7539f95e1a6aba536d35bc6 refs/Origin/master
ce qui indique que vous avez probablement exécuté quelque chose comme la commande de bas niveau suivante:
git update-ref refs/Origin/master master
Cette commande crée une branche (pointant vers le même commit que master
) appelée Origin/master
, mais vivant directement sous refs/
, c'est-à-dire extérieur le refs/heads/
espace de noms, où les succursales locales vivent normalement. Assez suspect ... Vouliez-vous faire ça?
Une telle branche ne sera pas répertoriée par git branch -a
. Git devient confus, cependant, car il voit deux branches dont les noms se terminent par Origin/master
:
refs/remotes/Origin/master
, votre branche de suivi à distance, etrefs/Origin/master
, la branche locale que vous avez créée (par accident) en dehors de refs/heads/
.refs/Origin/master
Supprimez-le simplement:
git update-ref -d refs/Origin/master
Ensuite, il n'y aura aucune ambiguïté, et Git se conformera lorsque vous essayez de définir master
en amont.
refs/Origin/master
Pour éviter toute ambiguïté, spécifiez simplement le complet refname de la branche que vous souhaitez définir comme master
en amont:
git branch --set-upstream-to=refs/remotes/Origin/master master
Pour fixer des idées, voici du code qui reproduit la situation dans l'un de mes dépôts GitHub:
$ cd ~/Desktop
$ git clone https://github.com/Jubobs/gitdags && cd gitdags
$ git update-ref refs/Origin/master
$ git branch -a
* master
remotes/Origin/HEAD -> Origin/master
remotes/Origin/master
$ git show-ref master
15b28ec22dfb072ff4369b35ef18df51bb55e900 refs/heads/master
15b28ec22dfb072ff4369b35ef18df51bb55e900 refs/Origin/master
15b28ec22dfb072ff4369b35ef18df51bb55e900 refs/remotes/Origin/HEAD
15b28ec22dfb072ff4369b35ef18df51bb55e900 refs/remotes/Origin/master
$ git branch --set-upstream-to=Origin/master master
warning: refname 'Origin/master' is ambiguous.
fatal: Ambiguous object name: 'Origin/master'.
$ git update-ref -d refs/Origin/master
$ git branch --set-upstream-to=Origin/master master
Branch master set up to track remote branch master from Origin.
Vous avez probablement accidentellement créé une référence locale appelée 'Origin/master'
par exemple, si vous avez fait cela
git branch Origin/master
Cela conduirait à ce problème. Celui-ci a l'air suspect "refs/Origin/master". "refs/heads/master" est votre maître local, "refs/remotes/Origin/master" est votre référence de branche distante, et "refs/Origin/master" est probablement une erreur qui vous gâche.
Il vous suffit de supprimer cette référence (git update-ref -d) et les choses recommenceront à fonctionner.
J'ai rencontré un problème très similaire en raison d'une balise accidentelle nommée "master", apparaissant dans git show-ref master
comme refs/tags/master
. Le correctif dans ce cas était:
git tag -d master
J'ai rencontré le même problème il y a quelques jours où plusieurs références ont été créées pour la même branche.
Choses que j'ai essayées:
> git show-ref (will give you the list of references, from the
> references list you can check if there are multiple references created
> for the branch you are working on or not.)
Si plusieurs références sont créées, supprimez-les simplement
rm .git/refs/heads/master
Après avoir supprimé les références, vous ne pouvez retirer la branche de l'origine distante que si vous y avez inséré quelque chose, sinon vous devez refaire tout ce que vous avez fait dans la branche
git fetch Origin
git checkout Origin/branchName
Cette solution a fonctionné pour moi en cas de branches ambiguës.