Je viens d’engager la mauvaise source dans mon projet en utilisant l’option --force
.
Est-il possible de revenir? Je comprends que toutes les branches précédentes ont été écrasées à l’aide de l’option -f
; j’ai donc peut-être foiré mes révisions précédentes.
Généralement, Git ne jette rien, mais il peut être difficile de s'en remettre.
Si vous avez la bonne source, vous pouvez simplement l'insérer dans la télécommande avec l'option --force
. Git n'aura supprimé aucune branche à moins que vous ne le lui ayez dit. Si vous avez réellement perdu des commits, jetez un coup d’œil à ce guide utile pour récupérer des commits . Si vous connaissez le SHA-1 des commits que vous voulez, vous êtes probablement OK.
Meilleure chose à faire: sauvegardez tout et voyez ce qui se trouve toujours dans votre référentiel local. Faites la même chose sur la télécommande si possible. Utilisez git fsck
pour voir si vous pouvez récupérer des objets, et surtout NE PAS exécuter git gc
.
Surtout, n'utilisez jamais l'option --force
à moins que vous ne le pensiez vraiment.
Si vous connaissez le hash de commit, c'est facile, il vous suffit de recréer votre branche.
5794458...b459f069 master -> master (forced update)
Supprimer la branche distante:
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é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 ne vous trouvez pas sur le référentiel local d'où provient le Push forcé, au niveau Origin/Master, il n'y a aucun moyen de récupérer. Mais si vous êtes assez chanceux pour utiliser GitHub ou GitHub for Enterprise , vous pouvez jeter un coup d’œil à l’API REST et récupérer le commit perdu sous forme de patch, Exemple:
https://api.github.com/repos/Apache/logging-log4j2/commits/889232e28f3863d2a17392c06c1dd8cac68485de
git apply patch.patch && git commit -m "validation restaurée" && git maître d'origine Push
Un autre moyen de récupérer le commit perdu ou même de déterminer le nombre de commits perdus, si le Push précédent ne venait pas de votre dépôt local, consiste à regarder votre machine CI.
Si vous avez un travail qui teste la branche principale après chaque validation (ou une série de validations consécutives) que vous devriez avoir, vous pouvez consulter son dernier test. C'est le commit que vous devez restaurer.
La machine CI peut même conserver un clone local du référentiel, à partir duquel vous pourrez peut-être effectuer cette récupération.
Source: probablement Livraison continue: mises à jour logicielles fiables via l'automatisation de la création, du test et du déploiement (Série Signature Addison-Wesley (Fowler))
J'ai fait la même chose en annulant un dernier Push pour un seul fichier. Nous avons fini par revenir à l'état d'origine du référentiel. J'utilisais les commandes git de Linus car j'avais la copie locale sous Linux. Heureusement, cette copie était toujours intacte.
Tout ce que je fis (après avoir frénétiquement fait quelques copies supplémentaires du rapport local):
git add .
git status
(il est dit que Origin/master était en avance de 68 commits, bien ... ce sont tous les commits que j'ai supprimés)
git remote set-url Origin <GIT_SSH_URL>
git Push
Et tout a été restauré comme avant la poussée énergique… La chose la plus importante à retenir est de ne jamais faire de checkout. après avoir poussé avec force. Mais la meilleure pratique consiste à désactiver l'option Push. Je ne l'utilise plus jamais. Appris ma leçon !!
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é . J'ai mal fait 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, j’ai jeté un œil au terminal où j’ai mal fait «tirer» et j’ai vu leur sortie comme
60223bf ... 0b258eb une branche -> Origine/une branche
Le deuxième hachage 0b258eb était exactement ce dont j'avais besoin. Donc, j'ai pris ce hachage et produire la commande
git Push --force Origin 0b258eb:some-branch