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?
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.
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).
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:
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.
Réponses:
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
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:Ou pour le même effet, vous pouvez réinitialiser --hard à la branche d'origine:
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).
la source
ORIG_HEAD
la valeur de hachage d'origine de la branche rebasée. Donc, plutôt que de trouver le numéro 2 pourHEAD@{2}
, vous pouvez simplement utiliserORIG_HEAD
... mais seulement s'ilORIG_HEAD
n'est toujours pas dérangé. Un tas de commandes Git le définissent (rebase, am, reset et fusion, dans diverses circonstances).Rebase conserve une sauvegarde de l'ancien état sous la forme
ORIG_HEAD
.Vous pouvez donc annuler le dernier rebase en exécutant:
la source