J'ai besoin de récupérer deux branches Git que j'ai supprimées d'une manière ou d'une autre lors d'un push.
Ces deux branches ont été créées sur un système différent et ensuite poussées vers mon référentiel «partagé» (github).
Sur mon système, j'ai (apparemment) récupéré les branches lors d'une récupération:
~/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 effort pour envoyer mes modifications locales au repo 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 [email protected]: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
Ce n'est pas très facile de retirer les branches de leur machine de naissance, alors j'aimerais essayer de les récupérer auprès de ma section locale si possible.
Toutes les informations git "undo" que j'ai recherchées sur Google doivent récupérer les commits perdus. Je ne pense pas que cela s'applique ici, car je n'ai pas d'UID de validation pour ces branches.
J'aimerais savoir comment je peux les récupérer. J'aimerais également savoir comment ils ont été supprimés en premier lieu et comment je peux éviter cela à l'avenir.
EDIT: sur demande, voici ma configuration de repo
user.name=Craig Walker
[email protected]
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/*
[email protected]: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
git config -l
montre le référentiel local?remote.origin.fetch
refspec n'est pas approprié pour une utilisation avecremote.origin.mirror = true
. Voulez-vous mettre en miroir ou voulez-vous utiliser le dépôt GitHub comme une télécommande normale? Ma réponse devrait avoir les commandes dont vous avez besoin de toute façon.Réponses:
Je ne suis pas un expert. Mais tu peux essayer
pour trouver le commit HEAD de la branche supprimée et les récupérer.
la source
git branch <uid>
je les ai récupérés. Merci!remotes.origin.mirror
et vosremotes.origin.fetch
paramètres, sinon vous risquez de rencontrer à nouveau le problème (ou de supprimer involontairement les commits poussés à partir d'autres dépôts).git fsck --full --no-reflogs | cut -d' ' -f3 | xargs -P8 git log --oneline | grep 'Release 2.60.0.157'
juste deux commandes me sauvent la vie
1. Cela listera tous les HEAD précédents
2. Cela rétablira la validation HEAD que vous avez supprimée.
la source
git reflog
. Y a-t-il autre chose que je puisse essayer?Vos branches supprimées ne sont pas perdues, elles ont été copiées dans origin / contact_page et origin / new_pictures "branches de suivi à distance" par la récupération que vous avez montrée (elles ont également été repoussées par le push que vous avez montré, mais elles ont été poussées dans refs / remotes / origin / au lieu de refs / heads /). Vérifiez
git log origin/contact_page
etgit log origin/new_pictures
pour voir si vos copies locales sont «à jour» avec tout ce que vous pensez devrait être là. Si de nouveaux commits ont été poussés sur ces branches (à partir d'un autre dépôt) entre l'extraction et le push que vous avez montrés, vous les avez peut-être «perdus» (mais vous pourriez probablement les trouver dans l'autre dépôt qui a le plus récemment poussé ces branches) .Conflit d'extraction / transmission
Il semble que vous récupérez dans un `` mode distant '' normal (les références / têtes distantes / sont stockées localement dans les références / télécommandes / origine /), mais en poussant en `` mode miroir '' (les références locales / sont poussées sur les références distantes /) . Vérifiez votre .git / config et réconciliez les paramètres
remote.origin.fetch
etremote.origin.push
.Faire une sauvegarde
Avant d'essayer des modifications, créez une simple archive tar ou zip ou l'ensemble de votre dépôt local. De cette façon, si vous n'aimez pas ce qui se passe, vous pouvez réessayer à partir d'un dépôt restauré.
Option A: reconfigurer en miroir
Si vous avez l'intention d'utiliser votre dépôt distant comme miroir de votre dépôt local, procédez comme suit:
Vous pourriez aussi éventuellement vouloir supprimer toutes vos références / télécommandes / origine / références, car elles ne sont pas utiles si vous travaillez en mode miroir (vos branches normales remplacent les branches de suivi à distance habituelles).
Option B: Reconfigurer en tant que télécommande normale
Mais comme il semble que vous utilisez ce dépôt distant avec plusieurs dépôts «de travail», vous ne voulez probablement pas utiliser le mode miroir. Vous pouvez essayer ceci:
, Vous voudrez éventuellement ensuite supprimer les refs / faux / refs Distants origine dans votre repo à distance:
git push origin :refs/remotes/origin/contact_page :refs/remotes/origin/new_pictures …
.Test Push
Essayez
git push --dry-run
de voir ce qu'ilgit push
ferait sans lui demander de modifier le référentiel distant. Si vous n'aimez pas ce qu'il va faire, récupérez à partir de votre sauvegarde (tar / zip) et essayez l'autre option.la source
.git
répertoire, assurez-vous de vérifier.git/packed_refs
en plus de.git/refs/
.git show-ref
va vider toutes vos références locales (emballées ou «en vrac»). Vous devriez toujours être en mesure de trouver les références dans le dépôt qui les a initialement poussées vers votre dépôt GitHub (sur une machine différente? Le dépôt de quelqu'un d'autre?). A défaut, aussi longtemps que vous ne l' avez pas fait gc ou pruneau, vous devriez être en mesure de lagit fsck
sortie d'examiner les commits ballants et les remettre en place:git branch contact_page-recovered <SHA-1-of-dangling-commit>
.Si la suppression est assez récente (comme un moment Oh-NO!), Vous devriez toujours avoir un message:
Deleted branch <branch name> (was abcdefghi).
vous pouvez toujours exécuter:
git checkout abcdefghi
git checkout -b <some new branch name or the old one>
la source
découvrir coimmit id
git reflog
récupérer la branche locale que vous avez supprimée par erreur
git branch need-recover-branch-name commitId
pousser à nouveau need-recover-branch-name si vous avez également supprimé la branche distante avant
git push origin need-recover-branch-name
la source
git reflog
, plutôt que d'avoir à deviner etgit show
.Les données existent toujours dans github, vous pouvez créer une nouvelle branche à partir des anciennes données:
la source
Je pense que vous avez une configuration incohérente pour «fetch» et «push», donc cela a empêché le fetch / push par défaut de faire un aller-retour correctement. Heureusement, vous avez récupéré les branches que vous avez supprimées par la suite, vous devriez donc pouvoir les recréer avec une poussée explicite.
la source
git push origin origin/contact_page:contact_page
reçois ceci:error: src refspec origin/contact_page does not match any
git rev-parse refs/remotes/origin/origin/contact_page
dit-on? En raison de la configuration bidon de «miroir», la branche peut maintenant être référencée ici dans le référentiel local.Si votre organisation utilise JIRA ou un autre système similaire lié à git, vous pouvez trouver les commits répertoriés sur le ticket lui-même et cliquer sur les liens vers les modifications de code. Github supprime la branche, mais les commits sont toujours disponibles pour le tri sélectif.
la source
Cela peut sembler trop prudent, mais je zip fréquemment une copie de tout ce sur quoi j'ai travaillé avant d'apporter des modifications au contrôle de code source. Dans un projet Gitlab sur lequel je travaille, j'ai récemment supprimé une branche distante par erreur que je voulais conserver après la fusion d'une demande de fusion. Il s'est avéré que tout ce que j'avais à faire pour le récupérer avec l'historique des validations était de pousser à nouveau. La demande de fusion était toujours suivie par Gitlab, elle affiche donc toujours l'étiquette bleue «fusionnée» à droite de la branche. J'ai toujours compressé mon dossier local au cas où quelque chose de grave se produirait.
la source