524 votes

Comment puis-je rétablir un dépôt git à un commit spécifique ?

Mon dépôt contient 100 commits à l'heure actuelle. J'ai besoin de revenir en arrière jusqu'au commit 80, et de supprimer tous les commits suivants.

Pourquoi ?

Ce dépôt est censé être destiné à la fusion des données de divers utilisateurs. Un certain nombre de fusions sont entrées comme des commits de moi, en raison d'une édition excessive. C'était dû à un mauvais étiquetage de mes branches distantes, où 3 développeurs étaient étiquetés comme étant l'un l'autre. J'ai besoin de réinitialiser à ce point, et puis tirer vers l'avant.

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

Cependant, git me demande de faire beaucoup de gestion de conflits. Existe-t-il un moyen plus simple ?

1083voto

jtdubs Points 4952
git reset --hard <old-commit-id>
git push -f <remote-name> <branch-name>

Note : Comme écrit dans les commentaires ci-dessous, Utiliser cela est dangereux dans un environnement collaboratif : vous réécrivez l'histoire.

0 votes

Cette solution m'indique que github est à jour, et que les changements ne sont pas effectués.

61 votes

Les gens, font git push -f origin branch . J'ai juste passé un mauvais moment, parce que ça m'a manqué.

28 votes

ATTENTION ! Vous perdrez tous vos commits en local, et si vous poussez, il n'y aura pas de retour en arrière.

41voto

ninja08 Points 430

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

D'abord :

git log

obtenir le tout dernier identifiant SHA à annuler.

git revert SHA

Cela créera un nouveau commit qui fera exactement le contraire de votre commit. Vous pouvez alors pousser ce nouveau commit pour remettre votre application dans l'état où elle était avant, et votre historique git montrera ces changements en conséquence.

C'est une bonne solution pour refaire immédiatement quelque chose que vous venez de faire, ce qui est plus souvent le cas pour moi.

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

git revert HEAD

11 votes

git revert HEAD rétablira le dernier commit sans avoir à chercher le hash.

0 votes

C'est une solution si vous ne voulez pas du tout supprimer les commits. Cependant, dans ce cas, tous les commits poubelles seront toujours là, et permettront à un cloneur de les réinitialiser ou de les vérifier. Si vous voulez empêcher cela, vous DEVEZ forcer le passage.

1 votes

Remarque : Ces annulations peuvent s'empiler, ce qui signifie que si vous effectuez une annulation accidentelle, vous pouvez annuler l'annulation avec une autre annulation.

20voto

CommaToast Points 1165

Une autre façon :

Vérifiez la branche que vous voulez rétablir, puis réinitialisez votre copie de travail locale au commit que vous voulez être le plus récent sur le serveur distant (tout ce qui suit sera supprimé). Pour ce faire, dans SourceTree, j'ai fait un clic droit sur la branche et j'ai sélectionné "Reset BRANCHNAME to this commit".

Ensuite, naviguez dans le 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 

Ceci effacera tous les commits après le commit actuel dans votre dépôt local mais seulement pour cette branche.

1 votes

Pour info, "REPOSITORY_NAME" sera quelque chose comme https:/me@github.com/me/repo_name.git.

4 votes

Ce serait plus utile si vous pouviez décomposer cette commande et l'expliquer.

9voto

Ion Lesan Points 167

La plupart des suggestions supposent que vous devez d'une manière ou d'une autre détruire les 20 derniers commits, d'où l'expression "réécrire l'histoire", mais ce n'est pas nécessaire.

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 les branches ne sont 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.

0 votes

Je suppose que cela perturbe également les versions locales de l'histoire de la branche concernée.

0 votes

Si un tel retour en arrière est nécessaire, alors il est certain que les versions locales de chacun doivent récupérer la dernière version (préparée par la première personne). Ce serait plus sûr au cas où vous voudriez faire un "rollback the rollback".

5voto

Richard Nader Points 41

Lorsque je fais des mises à jour de branches à partir de master, j'ai remarqué que je clique parfois trop fort, ce qui entraîne la fusion de la branche dans le master, aussi. J'ai trouvé un moyen d'annuler cela.

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

git revert -m 1 HEAD

0 votes

Cela a bien fonctionné pour moi lorsque j'ai inversé le commit sur le repo distant.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X