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.

57
demandé sur Dawid Ferenczy 2010-10-20 04:54:59

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.

39
répondu Cameron Skinner 2016-11-25 17:45:04

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
39
répondu user1094125 2016-11-25 17:46:17

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
14
répondu Abdelhafid 2017-05-23 10:31:18

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:

  1. listez les événements et trouvez le commit sha1 long format

https://api.github.com/repos/apache/logging-log4j2/events

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

  1. appliquer localement et pousser à nouveau

git appliquer patch.patch && git commit-m "restauré commettre" && git push origin master

4
répondu Pierrick HYMBERT 2018-01-05 09:42:35

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!!

2
répondu Pran 2012-07-26 22:45:00

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))

1
répondu user7610 2018-08-16 07:15:39