Git comment annuler un rebase

104

Dans Git, comment annuler un rebase si vous n'êtes pas satisfait?

Git n'a pas de cycle à sec pour le rebase. Si j'ai fait un rebase et que je ne l'ai pas encore poussé, comment revenir en arrière, comme si cela ne s'était jamais produit?

user1615666
la source
4
git rebase --abort
olibiaz
2
Que voulez-vous dire «échoué»? Avez-vous terminé le rebase et vous n'aimez pas les résultats? Ou avez-vous rencontré des conflits et souhaitez-vous arrêter le rebase au milieu? Je présume la première, puisque vous ne pouvez pas pousser un rebase conflictuel et inachevé, mais je pose la question parce que ce sont deux questions différentes.
Edward Thomson
oui, ancien. Merci.
user1615666
3
Possible duplicata de Undoing a git rebase
Jon Schneider

Réponses:

213

Vous pouvez utiliser le reflog pour trouver la première action avant le début du rebase, puis réinitialiser - hard back to it. 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

Vous devriez maintenant être de retour avant le début du rebase.

Pour trouver le bon endroit pour réinitialiser, il vous suffit de choisir l'entrée la plus proche du haut qui ne commence pas par "rebase".

Approche alternative

Si le rebase est la seule chose que vous avez faite sur la branche, c'est-à-dire que vous n'avez pas de commits / modifications non poussés - alors vous pouvez simplement supprimer la branche locale avec git branch -D, puis la 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 exécutés, vous les aurez perdus. Dans ce cas, utilisez simplement l'approche reflog ci-dessus pour revenir à l'entrée reflog où vous avez effectué le ou les commit (s).

Robbie
la source
11
Un autre raccourci pratique: rebase définit ORIG_HEADla valeur de hachage d'origine de la branche rebasée. Donc, plutôt que de trouver le numéro 2 pour HEAD@{2}, vous pouvez simplement utiliser ORIG_HEAD... mais seulement s'il ORIG_HEADn'est toujours pas dérangé. Un tas de commandes Git le définissent (rebase, am, reset et fusion, dans diverses circonstances).
torek
1
Merci Monsieur! Grande aide à ce sujet :)
Alec
1
merci mon code source de retour .... après utilisation de cette $ git reset HEAD @ {2} --hard
reza rahmad
Obtient mon vote positif pour suggérer de simplement supprimer la branche locale et de la retirer à nouveau!
quicklikerabbit le
1
C'est une bouée de sauvetage. Merci @Robbie
Nelson Katale
42

Rebase conserve une sauvegarde de l'ancien état sous la forme ORIG_HEAD.
Vous pouvez donc annuler le dernier rebase en exécutant:

git reset --hard ORIG_HEAD
Meligy
la source
1
Savez-vous où cette étiquette est documentée?
Ben S
Y a-t-il un inconvénient à cela ou est-ce une nouvelle fonctionnalité? Cela semble tellement plus facile que de passer au crible un reflog.
1252748
Ce n'est pas nouveau. Mais vous l'utiliseriez généralement juste après le rebase, vous ne pouvez pas revenir rétrospectivement après plusieurs rebases, etc. ça maintenant? " cela fonctionne très bien.
Meligy