Pourquoi puis-je retirer une branche qui a été supprimée sur GitHub?


26

Dans notre référentiel GitHub, un collègue a supprimé une branche nommée release. Mais lorsque je lance git checkout releaselocalement, j'obtiens toujours la branche supprimée release. Idem, même lorsque j'ai extrait une autre branche, supprimé la releasebranche avec git branch -D releaseet 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?


1
Qu'est-ce que la git branch --remotesortie après l'exécution git fetch? Vous devrez peut-être tailler avec git fetch -ppour oublier les branches distantes supprimées.
Stephen Kitt

2
Si cette branche a déjà été poussée vers GitHub et que vous avez tiré après cela, vous avez également une copie de la branche. Chaque référentiel git est complet en soi, sauf si vous avez utilisé un clone peu profond ou quelque chose.
muru

@StephenKitt: Merci. git branch --remotesortie origin/release. Voulez-vous dire de s'exécuter git fetch -psans arguments supplémentaires, et élagera-t-il toutes les branches distantes supprimées?
Tim

1
Oui, git fetch -psans arguments supplémentaires élague toutes les branches distantes supprimées.
Stephen Kitt

1
Bienvenue dans le monde du contrôle de version distribué!
chrylis -en grève-

Réponses:


24

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:

$ git branch -a
[...]
release
remotes/origin/release
[...]

Vous avez seulement supprimé la "version" mais pas les "télécommandes / origine / version". Supprimez-le comme ceci:

$ git branch -rd origin/release

Ou supprimez toutes les branches récupérées qui n'existent plus du côté distant:

$ git remote prune origin 

Merci. Dans git branch -rd origin/release, qu'est-ce que cela -rsignifie? Ne -dsignifie la même chose que -D? Peut git branch -rd origin/releaseêtre remplacé par git branch -d remotes/origin/release?
Tim

@Tim: extrait du manuel; -r: List or delete (if used with -d) the remote-tracking branches.; -D:Shortcut for --delete --force.
boucleur

Merci. Peut git branch -rd origin/releaseêtre remplacé par git branch -d remotes/origin/release?
Tim

@Tim no -rfait référence aux succursales distantes , c'est nécessaire. Les branches locales et distantes sont stockées dans différents répertoires, comparer ls -l .git/refs/headset ls -l .git/refs/remotes. Vous pourriez également avoir une branche locale appelée remotes/origin/releasequi 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/.
rudimeier

15

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

git fetch -p

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,

git branch --remote

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 releasebranche sur le serveur, votre référentiel git local n'a pas perdu sa notion de releasebranche distante . La synchronisation avec git fetchmet à 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 avec git fetch -p(ou git fetch --prune, ou git remote prune) supprime les informations locales sur les branches distantes qui ont été supprimées.


Merci. msgstr "mettez à jour votre référentiel local avec toutes les modifications apportées au référentiel distant, mais sans mettre à jour vos succursales locales". De quelle mise à jour s'agit-il, étant donné qu'il ne s'agit pas d'une mise à jour de mes succursales locales?
Tim

Ce sont toutes les mises à jour à distance. Votre référentiel git local distingue vos branches locales et les branches distantes, mais les branches distantes ne sont pas synchronisées comme par magie avec le serveur - elles existent aussi localement (comme dans, stockées dans votre référentiel git local). La récupération synchronise votre référentiel local avec le référentiel distant et met à jour l'état des branches distantes; par défaut, les branches distantes supprimées ne sont pas supprimées des informations locales sur les branches distantes, -p( --prune) force cela.
Stephen Kitt

Merci. Pourquoi n'a-t-on pas supprimé la releasebranche git branch -D releaseavant de git checkout releasefaire git checkout releasecesser d'obtenir la releasebranche?
Tim

1
Parce que git checkout releaserecréera automatiquement une branche s'il existe une branche distante portant ce nom.
Stephen Kitt

Par "branche distante", voulez-vous dire une branche dans mon référentiel local ou référentiel Github? S'il est ancien, git branch -D releasea déjà supprimé la releasebranche dans mon référentiel local; Dans ce dernier cas, un collègue a supprimé la releasebranche 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

3

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 -pou supprimiez explicitement cette branche, votre section locale aura cette branche.


3
En quoi cette réponse diffère-t-elle des réponses déjà présentes?
Stephen Rauch

1

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 --mergedcommande 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.

for branch in `comm -12  <(git branch --merged|awk '{print($1)}') <(git branch -r --merged|awk '{print($1)}'|awk -F \/ '{print($2)}')`; do echo -e `git show --format="%ci %cr %an" $branch | head -n 1` \\t$branch; done | sort -r

(Malheureusement, "nice, digestible" ne s'applique pas au formatage des scripts eux-mêmes.)

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.