web-dev-qa-db-fra.com

GitHub - Comment rétablir les modifications à l'état précédent

J'utilise GitHub comme référentiel distant.

J'ai déjà poussé 5 validations sur le serveur et je souhaite revenir à l'état avant ces validations.

Si le hachage de validation est 3425661dba2aadccdbab, comment puis-je rétablir l'intégralité du local/distant sur ce commit? j'ai essayé

$ reset --hard 3425661dba2aadccdbab

mais cela n'a fait que réinstaller ma tête de travail dans cette branche et m'oblige à faire un git pull encore. J'ai essayé la caisse, mais cela m'a fait atterrir dans une branche "tête détachée".

39
Zhen

Vous avez essentiellement deux options pour annuler les modifications:

  1. créer un nouveau commit qui applique les changements inverses. C'est l'option préférée car elle ne modifie pas l'historique sur un référentiel public
  2. Retirez les commits et forcez-les à les pousser.

La première option peut être obtenue en utilisant git revert

git-revert - Annule certaines validations existantes

Étant donné une ou plusieurs validations existantes, annulez les modifications apportées par les correctifs associés et enregistrez de nouvelles validations qui les enregistrent.

Un exemple serait git revert -n HEAD~5..HEAD. Cette commande crée 5 nouveaux validations, chacune annulant l'une des 5 dernières validations de la branche actuellement extraite.

La deuxième option serait de supprimer réellement les commits. Notez que cela modifie l'historique dans le référentiel. Donc, toute personne qui a déjà tiré les changements sera probablement plutôt surprise et les choses peuvent devenir rapidement désordonnées. Cela dit, vous pouvez faire

git reset --hard HEAD~5
git Push --force

La première commande effacera toutes les modifications non validées dans votre copie de travail actuelle. et réinitialisez votre dépôt local à l'état du courant HEAD - 5 commits. La deuxième commande forcera-Push à la télécommande par défaut (c'est-à-dire GitHub) Là, tout changement s'écartant de votre dépôt local actuel sont écrasés.

ne note d'avertissement à nouveau: si vous ne savez pas vraiment ce que vous faites, n'utilisez pas cette option car cela peut entraîner une perte de données pour vous ou pour les autres si ce n'est pas fait correctement. Utilisez le premier au lieu de cela car il supprimera de manière transparente les modifications mais sans les effets secondaires désagréables de la réécriture de l'historique.

61
Holger Just

Fait une git Push -f. Ce n'est pas une bonne idée si d'autres personnes utilisent le même dépôt.

3
Chandra Sekar

Effectuez une vérification Git, puis validez-la dans la branche de votre choix. Cela fera un nouveau commit avec l'ancien code (vous aurez donc 6 commits).

git checkout HEAD~3, où 3 est le nombre de validations que vous souhaitez rétablir.

Mieux encore, vous pouvez extraire un seul fichier dans la HEAD actuelle:

git checkout 3425661dba2aadccdbab:path/to/file/from/base

Cela réduira la probabilité de mettre d'autres personnes en colère lorsque vous tirez le tapis proverbial sous leurs pieds.

MODIFIER:

Il y a une question similaire ici:

Extraire l'ancien commit et en faire un nouveau commit

2
beatgammit

Tu peux faire git revert <commit> à tous les commits effectués après votre état requis. (Dans l'ordre inverse pour éviter tout conflit.)

C'est une façon propre s'il y a d'autres personnes partageant le repo, mais un peu d'efforts. (Vous pouvez cependant automatiser ...?)

2
Sailesh