171 votes

Git : comment annuler un rebasement

Dans Git, comment revenir en arrière sur un rebasement si l'on n'en est pas satisfait ?

Git ne dispose pas de dry-run pour les rebasements. Si j'ai fait un rebasement et que je ne l'ai pas encore poussé, comment puis-je revenir en arrière, comme si cela n'était jamais arrivé ?

4 votes

Git rebase --abort

2 votes

Que voulez-vous dire par "échoué" ? Avez-vous complet le rebasement, et vous n'aimez pas les résultats ? Ou bien vous avez rencontré des conflits et avez voulu arrêter le rebasement en plein milieu ? Je présume que c'est le premier cas, puisque vous ne peut pas pousser un conflit, un rebasement inachevé, mais je demande parce que ce sont deux questions différentes.

0 votes

Oui, anciennement. Merci.

344voto

Robbie Points 3642

Vous pouvez utiliser le reflog pour trouver la première action avant que le rebasement ne commence, puis revenir à cette action avec --hard, par exemple

$ git reflog

b710729 HEAD@{0}: rebase: some commit
5ad7c1c HEAD@{1}: rebase: another commit
deafcbf HEAD@{2}: checkout: moving from master to my-branch
...

$ git reset HEAD@{2} --hard

Maintenant vous devriez être de retour avant le début du rebasement.

Pour trouver le bon endroit où réinitialiser, il suffit de choisir l'entrée la plus proche du haut qui n'a pas commencer par "rebase".

Approche alternative

Si le rebasement est le seule chose que vous avez fait sur la branche, c'est-à-dire que vous n'avez pas de commits/changements non poussés - alors vous pouvez simplement supprimer la branche locale avec git branch -D et ensuite vérifier à nouveau :

$ git checkout my-branch
$ git rebase master
// not happy with result
$ git checkout master
$ git branch -D my-branch
$ git checkout my-branch

Ou pour le même effet, vous pouvez réinitialiser --hard à la branche d'origine :

$ git reset --hard origin/my-branch

Si vous avez fait cela alors que vous aviez d'autres commits non poussés, alors vous les aurez perdus. Dans ce cas, utilisez simplement l'approche reflog ci-dessus pour revenir à l'entrée reflog où vous avez fait le(s) commit(s).

13 votes

Un autre raccourci pratique : les ensembles de rebasement ORIG_HEAD à la valeur de hachage originale de la branche qui est rebasée. Ainsi, plutôt que de trouver le nombre 2 pour HEAD@{2} vous pouvez simplement utiliser ORIG_HEAD ... mais uniquement si ORIG_HEAD n'est toujours pas perturbée. Un tas de commandes Git le fixe (rebase, am, reset, et merge, dans diverses circonstances).

1 votes

Merci, monsieur ! Grande aide sur ce point :)

1 votes

Merci, mon code source est de retour.... après avoir utilisé ce $ git reset HEAD@{2} --hard

78voto

Meligy Points 10138

Rebase conserve une sauvegarde de l'ancien état en tant que ORIG_HEAD .
Vous pouvez donc revenir en arrière en exécutant le dernier rebasement :

git reset --hard ORIG_HEAD

2 votes

Savez-vous par hasard où ce tag est documenté ?

0 votes

Y a-t-il un inconvénient à cela ou s'agit-il d'une nouvelle fonctionnalité ? Cela semble tellement plus facile que de passer au crible un reflog.

1 votes

Ce n'est pas nouveau. Mais on l'utilise généralement juste après le rebasement, on ne peut pas revenir en arrière après plusieurs rebasements, etc. Pour ces situations complexes, vous chercheriez le truc du relog, mais pour le simple "oops, qu'est-ce que je viens de faire ? Comment puis-je revenir en arrière maintenant ?", cela fonctionne très bien.

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