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.

Jake
la source

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.

Elmarco
la source
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
Pat Notz
la source
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://[email protected]'
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
geedoubleya
la source
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?

Hazok
la source
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.