Restauration d'un référentiel Git distant


111

J'ai un référentiel Git distant, et je dois ramener les derniers ncommits dans l'oubli.

Réponses:


135

Vous pouvez utiliser git revert <commit>…pour tous les n commits, puis pousser comme d'habitude, en gardant l'historique inchangé.

Ou vous pouvez "revenir en arrière" avec git reset --hard HEAD~n. Si vous poussez dans un référentiel public ou partagé, vous pouvez diverger et interrompre le travail des autres en fonction de votre branche d'origine. Git vous empêchera de le faire, mais vous pouvez l'utiliser git push -fpour forcer la mise à jour.


5
Vous pouvez revenir à une validation spécifique en utilisant: git reset --hard [sha1]où sha1 est l'identificateur de hachage de validation.
pisaruk

7
Vous ne pouvez pas utiliser get reset --hard dans un référentiel distant car il n'y a pas de répertoire de travail. La question originale indique seulement qu'il y a un repo distant, il n'y a aucune mention d'un repo local.
Hazok

2
juste une note, git push -f forcera à pousser toutes les branches locales vers leurs télécommandes
cowlinator

Veuillez garder à l'esprit que l'utilisation revertentraînera la fusion de vos branches de fonctionnalités comme "déjà" fusionnées. C'est parce que ces branches sont en train d'être fusionnées. Mais les changements ont été annulés. Solution: choisissez Cherry ou annulez la validation de retour .
Benedikt le

@Benedikt entraîne-t-il reset --hardégalement que les branches de fonctionnalités sont traitées comme déjà fusionnées? Mon hypothèse est que ce ne serait pas (où le revertferait).
Marcus Leon

37

elmarco a raison ... sa suggestion est la meilleure pour les référentiels partagés / publics (ou, au moins, les branches publiques). S'il n'a pas été partagé (ou si vous êtes prêt à perturber les autres), vous pouvez également pousser une référence particulière:

git push origin old_master:master

Ou, s'il y a un commit SHA1 particulier (disons 1e4f99e sous forme abrégée), vous souhaitez revenir:

git push origin 1e4f99e:master

9

Heureusement, j'étais en mesure d'utiliser la solution de Pat Notz qui a complètement supprimé le commit indésirable. Cependant, au départ, j'ai eu l'erreur

error: failed to push some refs to 'ssh://git@gitrepo.git'
To prevent you from losing history, non-fast-forward updates were rejected*

Mais l'ajout de l' -foption force ( ) écrase cette erreur

git push -f origin 52e36b294e:master

3

Si vous avez un accès direct au référentiel distant, vous pouvez toujours utiliser:

git reset --soft <sha1>

Cela fonctionne car il n'y a aucune tentative de modifier le répertoire de travail inexistant. Pour plus de détails, veuillez consulter la réponse originale:

Comment puis-je annuler la validation du dernier commit dans un dépôt nu git?


2
Pourquoi serait --softmême nécessaire? Vous pourriez probablement faire la même chose avec tout simplement git reset, sans l'indicateur de mode.
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.