'git branch -av' montrant une branche distante qui n'existe plus

168

C'est probablement une question stupide, mais je suis tout nouveau dans git et je vois une branche distante qui n'existe plus.

$ git branch -a
* master
  remotes/origin/master
  remotes/origin/production

Je ne pense pas que la branche de production existe à distance et je n'arrive pas à comprendre pourquoi elle s'affiche toujours localement. Comment puis-je supprimer / supprimer cette branche? Voici à quoi ressemble une tentative de suppression:

$ git push origin :production

error: unable to push to unqualified destination: production
The destination refspec neither matches an existing ref on the remote nor
begins with refs/, and we are unable to guess a prefix based on the source ref.
error: failed to push some refs to 'git@IP:puppet.git'

Je peux vérifier la branche de production soi-disant distante, mais obtenez ceci:

$ git checkout origin/production
Note: checking out 'origin/production'.

You are in 'detached HEAD' state. You can look around, make experimental
changes and commit them, and you can discard any commits you make in this
state without impacting any branches by performing another checkout.

If you want to create a new branch to retain commits you create, you may
do so (now or later) by using -b with the checkout command again. Example:

  git checkout -b new_branch_name

HEAD is now at c323996... added powerdns module, no really

Je n'ai aucune idée de ce que je fais. Toute aide serait appréciée.

Carpe Noctem
la source
quel est le résultat git branch -aaprès un git fetch?
alediaferia
Le duplicata que j'ai proposé a une réponse qui explique bien plus que ce que les gens ont fait ici.
Cascabel

Réponses:

338

Tu dois faire:

git remote prune origin
manojlds
la source
8
Merci qui a fonctionné! Pouvez-vous nous expliquer ce qui se passe dans les coulisses?
CarpeNoctem
12
Ce sont des branches de suivi à distance sur votre référentiel local et vous devez les effacer si les branches sont supprimées sur le référentiel distant.
manojlds
2
Rarement je trouve et implémente aussi rapidement une question et une réponse aussi simples.
jleach
Superbe.Dans mon local, je voyais des branches étranges qui n'avaient aucun lien avec le repo de base de code .Lorsque j'ai exécuté cette commande, elle a réglé ma branche d'origine locale, puis j'ai ajouté le maître en amont .Merci
Ankur Srivastava
54

Il y a donc deux problèmes. Dans les deux cas, rappelez-vous que Git est distribué.

Première. Quand tu fais des choses comme

$ git branch -a

l'opération est effectuée sur votre dépôt local PAS sur l'ordinateur distant. En d'autres termes, votre repo local rapporte toutes les succursales dont il a connaissance. Il peut s'agir de branches locales (comme «master») ou de branches distantes qu'il a récupérées à partir d'une télécommande. Depuis la dernière extraction, la branche «production» du dépôt distant a changé, mais votre dépôt local ne le sait pas. La réponse des manojlds est correcte. Courir

$ git remote prune origin

pour enlever les branches périmées.

La commande 'git push origin: production' est utilisée pour supprimer la branche du repo git de l'ordinateur distant. Pas votre repo local. Dans ce cas, quelqu'un d'autre a déjà supprimé la branche sur le référentiel git de l'ordinateur distant, vous voyez donc ce message d'erreur.

Voici un lien qui résume ces commandes.

Le deuxième problème concerne le paiement.

Lors de l'extraction d'une succursale, vous voulez le faire à partir d'une succursale locale et non de la succursale distante. C'est pourquoi vous obtenez l'erreur concernant une tête détachée. Le repo git-notes a une bonne explication du problème en détail sanglant. Fondamentalement, la phrase clé est

Cependant, lorsque vous retirez tout ce qui n'est pas un nom de branche local approprié, HEAD n'est plus une référence symbolique à quoi que ce soit. Au lieu de cela, il contient en fait le hachage SHA-1 (l'ID de validation) du commit vers lequel vous passez.

Maintenant, comment vérifier une branche locale, qui est la même que la branche distante?

Facile, vous créez une succursale locale, au moment du paiement de la succursale distante.

$ git checkout -b origine / production de ma_branche_locale

Pablo Maurin
la source
20
git remote prune origin

est correct, il suffit d'ajouter que vous pouvez utiliser l' --dry-runoption, qui indique quelles branches seront élaguées de votre dépôt local, mais ne les élague pas réellement

git remote prune origin --dry-run
0xcrab
la source