Comment puis-je récupérer d'un push-F origine master erroné?
j'ai juste commis la mauvaise source à mon projet en utilisant l'option --force
.
est-il possible de revenir en arrière? Je comprends que toutes les branches précédentes ont été réécrites en utilisant l'option -f
, donc j'ai peut-être foiré mes révisions précédentes.
6 réponses
Git ne jette généralement rien loin, mais récupérer de cela peut encore être difficile.
si vous avez la bonne source, vous pouvez simplement la pousser dans la télécommande avec l'option --force
. Git n'aura pas supprimé de branches à moins que vous ne le lui ayez demandé. Si vous avez réellement perdu commits, jetez un coup d'oeil à ce guide utile pour récupérer commits . Si vous connaissez le SHA-1 des commits que vous voulez alors vous êtes probablement OK.
la meilleure chose à faire: Sauvegarder tout et voir ce qui est encore dans votre dépôt local. Faire de même sur la télécommande si possible. Utilisez git fsck
pour voir si vous pouvez récupérer des choses, et surtout ne pas exécuter git gc
.
par-dessus tout, n'utilisez jamais l'option --force
à moins que vous ne le pensiez vraiment.
si vous connaissez le hash de commit, c'est facile, il suffit de recréer votre branche.
5794458...b459f069 master -> master (forced update)
supprimer la branche distante:
git push origin :master
puis recréer votre branche avec les commandes suivantes:
git checkout 5794458
git branch master
git push origin master
la solution est déjà mentionnée ici
# work on local master
git checkout master
# reset to the previous state of origin/master, as recorded by reflog
git reset --hard origin/master@{1}
# at this point verify that this is indeed the desired commit.
# (if necessary, use git reflog to find the right one, and
# git reset --hard to that one)
# finally, push the master branch (and only the master branch) to the server
git push -f origin master
si vous n'êtes pas sur la piste locale d'où vient la poussée forcée, au niveau origine/master, il n'y a aucun moyen de récupérer. Mais si vous êtes lucky assez pour utiliser GitHub ou Github for Enterprise , vous pouvez avoir un regard sur le REST API et récupérer perdu commit comme patch, exemple:
- listez les événements et trouvez le commit sha1 long format
- Téléchargez la propagation perdue et récupérez le correctif correspondant dans le chemin json .fichiers []/patch
https://api.github.com/repos/apache/logging-log4j2/commits/889232e28f3863d2a17392c06c1dd8cac68485de
- appliquer localement et pousser à nouveau
git appliquer patch.patch && git commit-m "restauré commettre" && git push origin master
j'ai fait la même chose tout en annulant une dernière poussée pour un seul fichier. Fini par aller retour à l'état d'origine du référentiel. J'utilisais les commandes Git de Linus car J'avais la copie locale sur Linux. Heureusement, cette copie était encore intacte.
Tout ce que j'ai fait était (après avoir fait frénétiquement peu d'autres copies du repo local):
git add .
git status
(il a dit que l'origine/maître était en avance de 68 commits, d'accord ... ceux qui ont été tous les commits que j'ai supprimé)
git remote set-url origin <GIT_SSH_URL>
git push
et tout a été restauré comme il était avant que je n'ai poussé avec force. La chose la plus importante à se rappeler est de ne jamais faire un checkout git . après vous a vigoureusement poussé. Mais la meilleure pratique est de désactiver l'option push. Je ne suis jamais à l'utiliser de nouveau. Appris ma leçon!!
une autre façon de récupérer le commit perdu ou même de comprendre ce que commits ont été perdus, si la poussée précédente n'est pas venue de votre repo local, est de regarder votre machine de CI.
si vous avez un travail qui teste la branche master après chaque commit (ou série de commits consécutifs), ce que vous devriez avoir, Vous pouvez jeter un oeil à ce qu'il testait en dernier. C'est le commit que vous devez restaurer.
la machine à CI peut même conserver un clone local du repo, à partir de laquelle vous pouvez être en mesure d'effectuer cette récupération.
Source: probablement Continuous Delivery: Reliable Software Releases through Build, Test, and Deployment Automation (Addison-Wesley Signature Series (Fowler))