Comment puis-je restaurer un référentiel github vers une validation spécifique?

431

Mon github contient 100 commits en ce moment. J'ai besoin de restaurer le référentiel pour valider 80, et supprimer tous les suivants.

Pourquoi? Ce dépôt est censé être destiné à la fusion d'utilisateurs divers. Un tas de fusions ont été effectuées en tant que commits de ma part, en raison d'un montage excessif. Cela était dû à un mauvais étiquetage de mes succursales distantes, où 3 développeurs étaient étiquetés les uns les autres. Je dois réinitialiser à ce point, puis tirer vers l'avant.

Je voulais rebaser, comme dans cet exemple: Comment puis-je supprimer un commit sur GitHub?

Cependant, git veut que je fasse beaucoup de gestion des conflits. Existe-t-il un moyen plus simple?

Jonathan Vanasco
la source

Réponses:

883
git reset --hard <old-commit-id>
git push -f <remote-name> <branch-name>

Remarque: Comme indiqué dans les commentaires ci-dessous, son utilisation est dangereuse dans un environnement collaboratif: vous réécrivez l'historique

jtdubs
la source
43
les gens, faites git push -f origin branch. J'ai juste passé un mauvais moment, parce que ça m'a manqué.
Sumit M Asok
21
Méfiez-vous de cela! vous perdrez tous vos commits localement, et si vous poussez, il n'y aura aucun moyen de revenir
Thomas
8
Ce n'est pas vrai, vous pouvez obtenir les anciens commits en utilisant git reflog
Jan Schaefer
27
vous devrez peut-être faire git push origin HEAD --forceau lieu de git push -f origin branchcar cela me donnait une error: src refspec branch does not match any.erreur
sprocket12
1
Oui, merci les gars. J'ai réussi à faire ce que je voulais. J'ai d'abord créé une branche distincte de celle qui précède la validation que je voulais annuler. Cloné localement. Puis appliqué vos recommandations sur cette copie, de cette façon, je n'ai pas compromis ma branche principale ...
Gauthier Boaglio
21

Pour annuler le commit le plus récent, je fais ceci:

Première:

git log

obtenir le tout dernier identifiant SHA à annuler.

git revert SHA

Cela créera un nouveau commit qui fait exactement le contraire de votre commit. Ensuite, vous pouvez pousser ce nouveau commit pour ramener votre application à l'état où elle était auparavant, et votre historique git montrera ces changements en conséquence.

C'est bon pour une reprise immédiate de quelque chose que vous venez de commettre, ce que je trouve plus souvent le cas pour moi.

Comme Mike l'a mentionné, vous pouvez également le faire:

git revert HEAD
Nick Res
la source
8
git revert HEADrétablira le dernier commit sans avoir à rechercher le hachage.
Mike Baranczak
C'est une solution si vous ne voulez pas du tout supprimer les commits. Cependant, dans ce cas, tous les commits d'ordures seront toujours là et permettront à un cloneur de les réinitialiser ou de les extraire. Si vous voulez empêcher cela, vous DEVEZ forcer.
cst1992
19

Autrement:

Extrayez la branche que vous souhaitez rétablir, puis réinitialisez votre copie de travail locale sur le commit que vous souhaitez être la dernière sur le serveur distant (tout ce qui se passera ensuite au revoir). Pour ce faire, dans SourceTree, j'ai fait un clic droit sur le et sélectionné "Réinitialiser BRANCHNAME à ce commit".

Ensuite, accédez au répertoire local de votre référentiel et exécutez cette commande:

git -c diff.mnemonicprefix=false -c core.quotepath=false push -v -f -- tags REPOSITORY_NAME BRANCHNAME:BRANCHNAME 

Cela effacera toutes les validations après celle en cours dans votre référentiel local, mais uniquement pour cette branche.

CommaToast
la source
1
Pour votre information « nom_référentiel » sera quelque chose comme https: /[email protected]/me/repo_name.git
tim
3
Il serait plus utile de décomposer cette commande et de l'expliquer.
cst1992
3

La plupart des suggestions supposent que vous devez d'une manière ou d'une autre détruire les 20 derniers commits, c'est pourquoi cela signifie «réécrire l'historique», mais ce n'est pas obligatoire.

Créez simplement une nouvelle branche à partir du commit # 80 et travaillez sur cette branche à l'avenir. Les 20 autres commits resteront sur l'ancienne branche orpheline.

Si vous voulez absolument que votre nouvelle branche porte le même nom, rappelez-vous que cette branche n'est en fait que des étiquettes. Renommez simplement votre ancienne branche en quelque chose d'autre, puis créez la nouvelle branche au commit # 80 avec le nom que vous voulez.

Ion Lesan
la source
Je suppose que cela dérange également de manière problématique avec les versions locales de tout le monde de l'histoire de la branche d'intérêt.
ragerdl
2

Lorsque je fais des mises à jour de branche à partir du maître, je remarque que je sur-clique parfois et que la branche fusionne également dans le maître. J'ai trouvé un moyen de défaire ça.

Si votre dernier commit était une fusion, un peu plus d'amour est nécessaire:

git revert -m 1 HEAD

Richard Nader
la source
1

Dans github, le moyen le plus simple est de supprimer la branche distante dans l'interface utilisateur de github, sous l'onglet branches. Vous devez vous assurer de supprimer les paramètres suivants pour rendre la branche supprimable:

  1. Pas une branche par défaut
  2. Aucune demande de sondage d'ouverture.
  3. La branche n'est pas protégée.

Recréez-le maintenant dans votre référentiel local pour pointer vers le point de validation précédent. et l'ajouter à nouveau au référentiel distant.

git checkout -b master 734c2b9b   # replace with your commit point

Poussez ensuite la branche locale vers la télécommande

git push -u origin master

Ajoutez à nouveau la branche par défaut et la protection de branche, etc.

Jianwu Chen
la source