130 votes

Git : Récupérer une branche supprimée (à distance)

J'ai besoin de récupérer deux branches Git que j'ai en quelque sorte supprimées lors d'un push.

Ces deux branches ont été créées sur un système différent, puis poussées vers mon dépôt "partagé" (github).

Sur mon système, j'ai (apparemment) récupéré les branches lors d'un fetch :

~/myfolder> git fetch
remote: Counting objects: 105, done.
remote: Compressing objects: 100% (58/58), done.
remote: Total 62 (delta 29), reused 0 (delta 0)
Unpacking objects: 100% (62/62), done.
From github.com:mygiturl
 * [new branch]      contact_page -> origin/contact_page
   731d1bb..e8b68cc  homepage   -> origin/homepage
 * [new branch]      new_pictures -> origin/new_pictures

Juste après, j'ai fait un push pour envoyer mes changements locaux vers le dépôt central. Pour une raison quelconque, ces branches ont été supprimées à la fois de mon système local et du dépôt central :

~/myfolder> git push
Counting objects: 71, done.
Delta compression using up to 2 threads.
Compressing objects: 100% (43/43), done.
Writing objects: 100% (49/49), 4.99 KiB, done.
Total 49 (delta 33), reused 0 (delta 0)
To git@github.com:mygiturl.git
 - [deleted]         contact_page
 + e8b68cc...731d1bb homepage -> homepage (forced update)
   bb7e9f2..e0d061c  master -> master
 - [deleted]         new_pictures
   e38ac2e..bb7e9f2  origin/HEAD -> origin/HEAD
   731d1bb..e8b68cc  origin/homepage -> origin/homepage
   e38ac2e..bb7e9f2  origin/master -> origin/master
 * [new branch]      origin/contact_page -> origin/contact_page
 * [new branch]      origin/new_pictures -> origin/new_pictures

Il n'est pas très facile d'extraire les branches de leur machine d'origine. J'aimerais donc essayer de les récupérer sur ma machine locale si possible.

Toutes les informations sur l'annulation de git que j'ai trouvées sur Google concernent la récupération de commits perdus. Je ne pense pas que cela s'applique ici, puisque je n'ai pas d'UID de commit pour ces branches.

J'aimerais savoir comment je peux les récupérer. J'aimerais également savoir comment ils ont été supprimés et comment je peux éviter cela à l'avenir.

EDIT : à la demande, voici la configuration de mon repo

user.name=Craig Walker
user.email=github@softcraft.ca
alias.unadd=reset HEAD
core.repositoryformatversion=0
core.filemode=true
core.bare=false
core.logallrefupdates=true
core.ignorecase=true
remote.origin.fetch=+refs/heads/*:refs/remotes/origin/*
remote.origin.url=git@github.com:MyGitURL.git
remote.origin.mirror=true
branch.master.remote=origin
branch.master.merge=refs/heads/master
alias.undo=reset --hard
alias.test=push -f ci HEAD:master
alias.st=status
alias.ci=commit
alias.br=branch
alias.co=checkout
alias.ch=checkout
alias.df=diff
alias.lg=log -p
alias.who=shortlog -s --
remote.ci.url=ContinuousIntegrationGitURL
remote.ci.fetch=+refs/heads/*:refs/remotes/ci/*
branch.photo.remote=origin
branch.photo.merge=refs/heads/photos
remote.foo.url=FooGitURL
remote.foo.fetch=+refs/heads/*:refs/remotes/cynthia/*
branch.homepage.remote=origin
branch.homepage.merge=refs/heads/homepage

0 votes

Il semble que vous ayez une configuration "inhabituelle" ou mal adaptée pour la récupération et la poussée. Que fait git config -l pour le référentiel local ?

0 votes

C'est tout à fait possible ; je l'ai affiché.

2 votes

Votre remote.origin.fetch refspec n'est pas approprié pour être utilisé avec remote.origin.mirror = true . Voulez-vous faire un miroir ou voulez-vous utiliser le repo GitHub comme une télécommande normale ? Ma réponse devrait contenir les commandes dont vous avez besoin dans les deux cas.

6voto

jhilden Points 759

Les données existent toujours sur github, vous pouvez créer une nouvelle branche à partir des anciennes données :

git checkout origin/BranchName #get a readonly pointer to the old branch
git checkout –b BranchName #create a new branch from the old
git push origin BranchName #publish the new branch

4voto

Roralee Points 358

Si votre organisation utilise JIRA ou un autre système similaire lié à git, vous pouvez trouver les commits listés sur le ticket lui-même et cliquer sur les liens vers les changements de code. Github supprime la branche mais garde les commits disponibles pour la sélection.

1voto

Charles Bailey Points 244082

Je pense que vous avez une mauvaise configuration pour 'fetch' et 'push', ce qui fait que le fetch/push par défaut ne fait pas l'aller-retour correctement. Heureusement, vous avez récupéré les branches que vous avez supprimées par la suite, vous devriez donc être en mesure de les recréer avec un push explicite.

git push origin origin/contact_page:contact_page origin/new_pictures:new_pictures

0 votes

Comme pour mon commentaire à @Chris Johnson, il semble que les branches n'existent plus (jamais ?) localement. Lorsque je git push origin origin/contact_page:contact_page Je comprends : error: src refspec origin/contact_page does not match any

0 votes

OK, je pense que je vois ce qui s'est passé, (bien que l'erreur complète serait utile). push a mis à jour la branche supprimée et a supprimé la référence localement aussi bien que c'est une référence de suivi. Que fait git rev-parse refs/remotes/origin/origin/contact_page dire ? A cause de la fausse configuration 'miroir', la branche peut maintenant être référencée ici dans le dépôt local.

0 votes

Bonjour Charles ; Depuis que j'ai écrit ceci, j'ai modifié (et corrigé) ma configuration de sorte que je n'obtienne plus la sortie (significative) de rev-parse. Cependant, je ne pense pas qu'il y avait un répertoire "origin" doublement imbriqué dans les remotes.

-2voto

Zoku012 Points 11

Cela peut sembler trop prudent, mais je zippe fréquemment une copie de ce sur quoi j'ai travaillé avant d'effectuer des changements dans le contrôle de la source. Dans un projet Gitlab sur lequel je travaille, j'ai récemment supprimé par erreur une branche distante que je voulais conserver après avoir fusionné une demande de fusion. Il s'est avéré que tout ce que j'avais à faire pour la récupérer avec l'historique des livraisons était de pousser à nouveau. La demande de fusion était toujours suivie par Gitlab, et l'étiquette bleue " merged " apparaît toujours à droite de la branche. J'ai quand même zippé mon dossier local au cas où quelque chose de grave se produirait.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X