Comment puis-je récupérer d'une git push erronée maître d'origine?
-
09-10-2019 - |
Question
Je viens commis la mauvaise source à mon projet en utilisant l'option --force
.
Est-il possible de revenir? Je comprends que toutes les branches précédentes ont été remplacées en utilisant l'option -f
, donc je l'ai foiré mes révisions précédentes.
La solution
Git généralement ne jette pas tout de suite, mais la récupération de ce qui peut encore être difficile.
Si vous avez la bonne source, alors vous pouvez simplement le pousser dans la télécommande avec l'option --force
. Git ne pas avoir effacé toutes les branches à moins que vous avez dit à. Si vous avez effectivement perdu commits alors jetez un 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: Retour tout et voir ce qui est encore dans votre dépôt local. Faites la même chose sur la télécommande si possible. Utilisez git fsck
pour voir si vous pouvez récupérer les choses, et surtout NE PAS faire fonctionner git gc
.
Au-dessus, surtout, ne jamais utiliser l'option --force
à moins que vous vraiment, vraiment dire.
Autres conseils
Si vous connaissez le hachage commettras, il est facile, juste recréer votre branche.
5794458...b459f069 master -> master (forced update)
Supprimer la branche à distance:
git push origin :master
puis recréez votre branche avec les commandes suivantes:
git checkout 5794458
git branch master
git push origin master
La solution est déjà mentionné
# 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 ce repo local où la poussée forcée est venu, à l'origine / niveau master il n'y a aucun moyen de récupérer. Mais si vous êtes chanceux suffisant pour utiliser GitHub ou GitHub pour l'entreprise , vous pouvez consulter le API REST et récupérer perdu commettent comme patch, par exemple:
- Liste des événements et trouver le commettras long format SHA1
https://api.github.com/repos/apache/logging- log4j2 / événements
- Télécharger la perte commit et récupérer le patch correspondante dans les .files chemin JSON [] / patch
- Appliquer localement et appuyez à nouveau sur
git appliquer patch.patch && git commit -m "commit restaurée" && maître git push origin
Je l'ai fait la même chose en défaisant une dernière poussée pour un seul fichier. A fini par aller à revenir à l'état d'origine du dépôt. J'utilisais des commandes git de Linus comme je l'ai eu la copie locale sur Linux. Heureusement, cette copie était encore intacte.
Tout ce que je n'étais (après frénétiquement faire quelques copies du repo local):
git add .
git status
(il a dit que l'origine / maître était en avance par 68 commits, bien ... ce étaient tous les commits je supprimé)
git remote set-url origin <GIT_SSH_URL>
git push
Et tout a restauré la façon dont il était avant que je l'ai fait pousser de force. La chose la plus importante à retenir est de ne jamais faire un git checkout. après que vous avez poussé avec force. Mais la meilleure pratique consiste à désactiver l'option push. Je ne l'utilise jamais. Appris ma leçon !!
Une autre façon de récupérer les perdus commettent ou même de comprendre ce commits ont été perdus, si la poussée précédente ne venait pas de votre repo local, est de regarder votre machine CI.
Si vous avez un emploi qui teste la branche maître après chaque commit (ou une série de commits consécutives), que vous devriez avoir, vous pouvez consulter ce qu'il testait dernière. C'est la vous engagerez-vous besoin de restaurer.
La machine CI peut même garder un clone local du repo, à partir de laquelle vous pourriez être en mesure d'effectuer cette reprise.
Source: probablement Livraison en continu: fiables versions de logiciels grâce à construire, tester et déploiement d'automatisation (Addison-Wesley Série Signature (Fowler))
Ici, vous pouvez lire les décisions https://evilmartians.com/chronicles/git-push---force-and-how-to-deal-with-it
Le second m'a aidé. Je l'ai fait mal ces commandes
1) (some-branch) git pull -> correct command was git pull origin some-branch
2) (some-branch) git push -f origin some-branch
Après ces commandes j'ai perdu trois commits. Pour les récupérer, je regardais à la borne où je l'ai fait à tort « git pull » et ai vu il y a une sortie comme
60223bf ... 0b258eb une branche -> origine / une branche
La deuxième 0b258eb de hachage était exactement ce que je avais besoin. Alors, je pris cette commande de hachage et produit
git push --force origin 0b258eb:some-branch