web-dev-qa-db-fra.com

Comment puis-je récupérer d'un maître git Push -f Origin erroné?

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.

65
mrdavenz

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.

44
Cameron Skinner

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
42
user1094125

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
19
Abdelhafid

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:

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

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

  1. Téléchargez le commit perdu et récupérez le patch correspondant dans le chemin json .files []/patch

https://api.github.com/repos/Apache/logging-log4j2/commits/889232e28f3863d2a17392c06c1dd8cac68485de

  1. Appliquer localement et appuyer à nouveau

git apply patch.patch && git commit -m "validation restaurée" && git maître d'origine Push

6
Pierrick HYMBERT

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

2
user7610

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

2
Pran

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
0
Andrey