Je viens de commettre la mauvaise source dans mon projet en utilisant l' --force
option.
Est-il possible de revenir en arrière? Je comprends que toutes les branches précédentes ont été écrasées en utilisant l' -f
option, donc j'ai peut-être foiré mes révisions précédentes.
git
git-commit
git-push
David van Dugteren
la source
la source
Réponses:
Git ne jette généralement rien, mais s'en remettre peut être difficile.
Si vous avez la bonne source, vous pouvez simplement la pousser dans la télécommande avec l'
--force
option. Git n'aura supprimé aucune branche à moins que vous ne le lui disiez. Si vous avez réellement perdu des commits, jetez un œ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 encore dans votre référentiel local. Faites 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écutergit gc
.Surtout, n'utilisez jamais l'
--force
option à moins que vous ne le pensiez vraiment, vraiment.la source
git reflog show remotes/origin/master
,. Vous devriez pouvoir voir votre poussée là-dedans; le commit dans la ligne précédente est là où il était avant que vous ne le fassiez. Vous pouvez alors simplement pousser cette révision (avec--force
) à l'origine, et revenir là où vous étiez!git fetch
édité depuis longtemps) vous pouvez afficher le reflog du côté de GitHub et récupérer!Si vous connaissez le hachage de commit, c'est facile, recréez simplement votre branche.
Supprimez la branche distante:
puis recréez votre branche avec les commandes suivantes:
la source
La solution est déjà mentionnée ici
la source
git reflog show remotes/origin/master
si git reflog est nécessaire (comme mentionné par @Cascabel ci-dessus)Si vous n'êtes pas dans le dépôt local d'où provient le push forcé, au niveau origine / maître, il n'y a aucun moyen de récupérer. Mais si vous avez la chance d'utiliser GitHub ou GitHub for Enterprise , vous pouvez jeter un œil à l' API REST et récupérer le commit perdu en tant que correctif, exemple:
la source
Une autre façon de récupérer le commit perdu ou même de déterminer quels commits ont été perdus, si le push précédent ne provenait pas de votre dépôt local, est de regarder votre machine 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 voir 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 dépôt, à partir duquel vous pourrez peut-être effectuer cette récupération.
Source: livraison probablement continue: versions logicielles fiables grâce à l'automatisation de la construction, des tests et du déploiement (Addison-Wesley Signature Series (Fowler))
la source
Oui, vous pouvez récupérer les commits après
git push -f your_branch
Vous pouvez donc faire:
1-
git reflog
2- vous choisissez Head_Number voulez-vous récupérer avec
git reset –hard HEAD@{HEAD-NUMBER}
3- vous pouvez voir tous les commits sur cette tête en
git cherry -v branch_name
4- à la fin, vous devez forcer la poussée
git push -f branch_name
OU
1- obtenir le nombre de SHA de votre client GIT (interface)
2- force de poussée
J'espère que cela t'aides
la source
J'ai fait la même chose en annulant une dernière poussée pour un seul fichier. J'ai 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 j'ai fait, c'est (après avoir frénétiquement fait quelques copies supplémentaires du repo local):
(il disait que l'origine / master était en avance de 68 commits, très bien ... ce sont tous les commits que j'ai supprimés)
Et tout a été restauré tel qu'il était avant que je ne pousse avec force. La chose la plus importante à retenir est de ne jamais faire un checkout git. après avoir poussé avec force. Mais la meilleure pratique consiste à désactiver l'option push. Je ne l'utilise plus jamais. J'ai appris ma leçon !!
la source
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
Après ces commandes, j'ai perdu trois commits. Pour les récupérer, j'ai regardé le terminal où j'ai mal fait 'git pull' et j'ai vu une sortie comme
60223bf ... 0b258eb une branche -> origine / une branche
Le deuxième hachage 0b258eb était exactement ce dont j'avais besoin. Alors, j'ai pris ce hachage et produire une commande
la source
Pour les personnes dans de très mauvaises situations comme moi (par exemple, si vous obtenez des
bad object
erreurs lors de l'exécutiongit reset --hard
):J'ai écrit un script appelé treesaver qui extrait tous vos fichiers de l'API GitHub en dernier recours. Voici comment l'utiliser:
treesaver
script etcd
vers lui.SHA
chaîne de l'arborescence que vous souhaitez restaurer en accédant àhttps://api.github.com/repos/<your_username_or_org>/<repo>/events
.payload
propriété correspondant à votre événement push, trouvez lecommit
vers lequel vous souhaitez revenir et cliquez sur sonurl
.commit.tree
, copiez letree
fichierurl
.python3 main.py <tree_url> <path_to_save_to>
.Par exemple, dans mon cas, je lancerais:
Bien sûr, les RP sont les bienvenus.
la source