Dans notre référentiel GitHub, un collègue a supprimé une branche nommée release
. Mais lorsque je lance git checkout release
localement, j'obtiens toujours la branche supprimée release
. Idem, même lorsque j'ai extrait une autre branche, supprimé la release
branche avec git branch -D release
et exécuté à nouveau git checkout release
.
Y a-t-il quelque chose à corriger sur le référentiel GitHub, ou dois-je réparer quelque chose localement?
git branch --remote
sortie après l'exécutiongit fetch
? Vous devrez peut-être tailler avecgit fetch -p
pour oublier les branches distantes supprimées.git branch --remote
sortieorigin/release
. Voulez-vous dire de s'exécutergit fetch -p
sans arguments supplémentaires, et élagera-t-il toutes les branches distantes supprimées?git fetch -p
sans arguments supplémentaires élague toutes les branches distantes supprimées.Réponses:
Après avoir supprimé une branche du côté distant, vous pouvez toujours voir cette branche distante précédemment récupérée localement, voir:
Vous avez seulement supprimé la "version" mais pas les "télécommandes / origine / version". Supprimez-le comme ceci:
Ou supprimez toutes les branches récupérées qui n'existent plus du côté distant:
la source
git branch -rd origin/release
, qu'est-ce que cela-r
signifie? Ne-d
signifie la même chose que-D
? Peutgit branch -rd origin/release
être remplacé pargit branch -d remotes/origin/release
?List or delete (if used with -d) the remote-tracking branches.
; -D:Shortcut for --delete --force.
git branch -rd origin/release
être remplacé pargit branch -d remotes/origin/release
?-r
fait référence aux succursales distantes , c'est nécessaire. Les branches locales et distantes sont stockées dans différents répertoires, comparerls -l .git/refs/heads
etls -l .git/refs/remotes
. Vous pourriez également avoir une branche locale appeléeremotes/origin/release
qui serait supprimée sans-r
. Cela peut sembler déroutant, mais vous pouvez simplement jouer, créer des branches avec des noms étranges et voir à quoi cela ressemble.git/
.Lorsque les branches sont supprimées à distance, vous devez tailler votre référentiel local - la façon la plus simple de le faire est de
Cela mettra à jour votre référentiel local avec toutes les modifications apportées au référentiel distant, mais sans mettre à jour aucune de vos succursales locales. Après avoir exécuté cela,
n'affichera plus la branche distante supprimée.
les référentiels git sont complets, que ce soit sur votre propre système ou sur le serveur. Ainsi, lorsque vous clonez un référentiel pour la première fois, vous obtenez une copie complète et votre git local "connaît" toutes les branches distantes ainsi que vos branches locales. Ces informations ne sont pas synchronisées automatiquement, donc lorsque votre collègue a supprimé la
release
branche sur le serveur, votre référentiel git local n'a pas perdu sa notion derelease
branche distante . La synchronisation avecgit fetch
met à jour toutes les informations locales sur les branches distantes afin qu'elles correspondent à l'état du serveur (à proprement parler, référentiel distant, où qu'il se trouve), mais sans supprimer aucune information locale sur les branches distantes. L'élagage avecgit fetch -p
(ougit fetch --prune
, ougit remote prune
) supprime les informations locales sur les branches distantes qui ont été supprimées.la source
-p
(--prune
) force cela.release
branchegit branch -D release
avant degit checkout release
fairegit checkout release
cesser d'obtenir larelease
branche?git checkout release
recréera automatiquement une branche s'il existe une branche distante portant ce nom.git branch -D release
a déjà supprimé larelease
branche dans mon référentiel local; Dans ce dernier cas, un collègue a supprimé larelease
branche sur GitHub; Donc je ne sais toujours pas pourquoi "va recréer automatiquement une branche s'il y a une branche distante avec ce nom"?Tim: Git est distribué VCS, donc lorsque vous clonez un dépôt à distance vers votre local, il clone tout (historique). Ainsi, lorsque vous avez cloné votre référentiel, il y avait une branche appelée release. Puisque votre collègue a supprimé la branche de publication à distance, jusqu'à ce que vous fassiez un élagage
git fetch -p
ou supprimiez explicitement cette branche, votre section locale aura cette branche.la source
Peut-être un peu tangentiel mais la perspective de ce site pourrait aider à comprendre le sujet général de la suppression des branches:
http://railsware.com/blog/2014/08/11/git-housekeeping-tutorial-clean-up-outdated-branches-in-local-and-remote-repositories/
Il y a un chevauchement avec certains de ce qui a déjà été discuté ici, mais l'accent est mis sur l'entretien ménager: supprimer les succursales, distantes et locales, qui ne sont plus nécessaires dans un environnement collaboratif. En particulier, la
git branch --merged
commande identifie les branches qui peuvent être supprimées en toute sécurité en raison de leur fusion avec votre ligne principale (ou la branche qui vous intéresse). Si vous collaborez, certains mini scripts plus sophistiqués comme celui-ci présenteront les choses dans un format agréable et digestible avec des dates et des auteurs.(Malheureusement, "nice, digestible" ne s'applique pas au formatage des scripts eux-mêmes.)
la source