Comment fonctionnent les succursales Git? Puis-je supprimer la branche principale?
22
J'ai un projet qui a 2 branches, développement et production. Je n'utilise pas la branche principale et chaque fois que j'écris, git statuselle m'indique à quelle distance ma branche est éloignée du maître.
Lorsque j'essaie de supprimer la branche principale, git branch -d masterelle la supprime uniquement sur mon référentiel local et non sur le serveur git distant. Des idées?
Dans Git, une branche n'est qu'une liste ordonnée de commits (aka: checkins). Quelque chose qui peut être un peu déroutant pour les nouveaux utilisateurs, c'est que les succursales n'ont pas besoin d'avoir un nom (bien que dans la plupart des cas, vous en vouliez un); et il n'y a rien de particulièrement spécial dans une branche particulière (la masterbranche est juste celle par défaut qui est créée pour vous lorsque vous initialisez un référentiel).
Vous le savez probablement déjà, mais Git est différent de certains autres systèmes de contrôle de version comme le populaire "Subversion", car chaque "copie de travail" (en langage Subversion) est un référentiel qui lui est propre ... en fait, il n'y a rien de particulièrement spécial sur toute copie particulière; sauf qu'une copie a été généralement acceptée comme étant la copie "canonique" utilisée pour stocker le produit final.
Donc, revenons à votre question ... le référentiel "canonique" que vous avez cloné lorsque vous avez commencé votre copie locale contenait une branche "master" par défaut; et il est coincé. Maintenant, si vous aviez accès à l'ordinateur qui contient le référentiel maître, vous pouvez vous connecter et exécuter:
git branch -d master
Cependant, si vous ne pouvez pas le faire, vous pouvez toujours le faire à partir de votre ordinateur local. La git branchcommande a une -roption qui affecte le référentiel distant. En d'autres termes, l'exécution de la commande suivante devrait fonctionner:
git branch -d -r master
Notez que dans ces deux cas; Je suppose que cela mastera été complètement fusionné dans l'historique de développement sur lequel se trouve actuellement votre copie locale. Si vous ne l'avez jamais utilisé masterauparavant (c.-à-d. Que vous ne vous êtes enregistré que sur developmentou production), vous n'avez rien à craindre. Cependant, si vous (ou quelqu'un d'autre) avez vérifié les choses master, vous pourriez avoir un problème. Vous pouvez forcer une suppression en changeant la -dpour -Dles commandes ci - dessus; mais je recommande fortement de vérifier pour voir ce qui est à l' masteravance! Si vous n'avez pas accès à l'ordinateur distant, vous ne pourrez probablement pas le récupérer!
Au fait; si vous (ou quelqu'un d'autre) êtes nouveau sur Git, je vous recommande fortement de lire Git de la base à la hausse par John Wiegley . Même si j'avais utilisé Git un peu par moi-même avant de trouver cet article, je n'ai pas vraiment compris comment cela fonctionnait jusqu'à ce que je le lise. C'est assez utile!
Depuis que j'ai écrit mon commentaire d'origine, le comportement de git a légèrement changé. Depuis git 1.7.12, git branch -d -r masterne supprime plus la branche distante - il supprime la connaissance de votre copie locale de la branche distante. La prochaine fois que vous git fetch, la succursale sera de retour! Au lieu de cela, vous aurez envie de courir git push origin :master. Essentiellement, ce que vous faites ici est de pousser une branche nulle (le nom de la branche vide à gauche de :) au-dessus de la branche distante (le nom de la branche à droite de la :), la supprimant efficacement.
mparker17
Il convient également de noter que lorsque vous clonez un référentiel, vous utilisez normalement par défaut la vérification de master. Cela dépend de la référence HEAD dans le référentiel que vous clonez. Donc, après la suppression du master, assurez-vous que la HEAD pointe vers la branche que vous souhaitez par défaut.
Zitrax
Votre lien vers Git à partir de la base est mort, mais il semble que ce soit le texte auquel vous faites référence (?) Pourriez-vous confirmer et peut-être mettre à jour le lien dans la réponse?
OR Mapper
OU Mappeur: C'est le texte auquel je fais référence: merci pour le nouveau lien! J'ai mis à jour le lien dans la réponse.
mparker17
4
masterest la branche par défaut de git. Je ne sais pas pourquoi c'est si terrible pour vous quand git vous indique à quelle distance vous êtes du maître, mais si vous voulez supprimer une branche de votre dépôt distant, la supprimer localement ne suffit pas. Essayez plutôt ceci:
git push origin :master
Cela ne poussera rien (la partie avant les deux-points) vers votre serveur d'origine et écrasera le maître. En d'autres termes, il doit supprimer la branche principale à distance.
J'obtiens: à distance: erreur: refus de supprimer la branche actuelle: refs / heads / master Pour github.com ***. Git ! Erreur [maître rejeté] (suppression de la branche actuelle interdite): impossible de pousser certaines références vers ' github.com ***. git'
git branch -d -r master
ne supprime plus la branche distante - il supprime la connaissance de votre copie locale de la branche distante. La prochaine fois que vousgit fetch
, la succursale sera de retour! Au lieu de cela, vous aurez envie de courirgit push origin :master
. Essentiellement, ce que vous faites ici est de pousser une branche nulle (le nom de la branche vide à gauche de:
) au-dessus de la branche distante (le nom de la branche à droite de la:
), la supprimant efficacement.master
est la branche par défaut de git. Je ne sais pas pourquoi c'est si terrible pour vous quand git vous indique à quelle distance vous êtes du maître, mais si vous voulez supprimer une branche de votre dépôt distant, la supprimer localement ne suffit pas. Essayez plutôt ceci:Cela ne poussera rien (la partie avant les deux-points) vers votre serveur d'origine et écrasera le maître. En d'autres termes, il doit supprimer la branche principale à distance.
la source