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.

Était-ce utile?

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:

  1. Liste des événements et trouver le commettras long format SHA1
  

https://api.github.com/repos/apache/logging- log4j2 / événements

  1. Télécharger la perte commit et récupérer le patch correspondante dans les .files chemin JSON [] / patch
  

https://api.github.com/repos/apache/ journalisation log4j2 / commits / 889232e28f3863d2a17392c06c1dd8cac68485de

  1. 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
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top