4016 votes

Annulation d'un rebasement git

Quelqu'un sait-il comment annuler facilement un rebasement git ?

Le seul moyen qui me vient à l'esprit est de le faire manuellement :

  • git checkout le commit parent aux deux branches
  • puis créer une branche temporaire à partir de là
  • sélectionne tous les commits à la main
  • remplacer la branche dans laquelle j'ai rebasé par la branche créée manuellement

Dans ma situation actuelle, cela va fonctionner car je peux facilement repérer les commits des deux branches (l'une était mon travail, l'autre celui de mon collègue).

Cependant, mon approche me semble sous-optimale et sujette aux erreurs (disons que je viens de rebaser avec 2 de mes propres branches).

Des idées ?

Clarification : Je parle d'un rebasement pendant lequel un tas de commits ont été rejoués. Pas seulement un.

5538voto

Charles Bailey Points 244082

Le moyen le plus simple serait de trouver le commit de tête de la branche tel qu'il était juste avant que la rebase ne commence dans le reflog...

git reflog

et de réinitialiser la branche courante à celle-ci (avec les avertissements habituels concernant la nécessité d'être absolument sûr avant de réinitialiser avec la commande --hard option).

# Suppose the old commit was HEAD@{5} in the ref log
git reset --hard HEAD@{5}

Vous pouvez vérifier l'historique de l'ancienne tête du candidat en faisant simplement un git log HEAD@{5} .

Si vous avez activé les reflogs par branche, vous devriez être en mesure de simplement faire git reflog branchname@{1} car un rebasement détache la tête de la branche avant de la rattacher à la tête finale. Je vérifierais cela, cependant, car je ne l'ai pas vérifié récemment. Vous pouvez le faire en ajoutant :

[user]
    logallrefupdates=true

1872voto

Pat Notz Points 46841

En fait, rebase sauvegarde votre point de départ à ORIG_HEAD donc c'est généralement aussi simple que :

git reset --hard ORIG_HEAD

Cependant, le reset , rebase y merge tous sauvegarder votre original HEAD pointeur dans ORIG_HEAD Donc, si vous avez effectué l'une de ces commandes depuis le rebasement que vous essayez d'annuler, vous devrez utiliser le reflog.

492voto

Allan Points 1444

La réponse de Charles fonctionne, mais vous pourriez vouloir faire ceci :

git rebase -i --abort

pour nettoyer après le reset .

Sinon, vous risquez d'obtenir le message " Interactive rebase already started ".

109voto

Aristotle Pagaltzis Points 43253

La réinitialisation de la branche sur l'objet committant de son ancienne pointe est bien sûr la meilleure solution, car elle restaure l'état précédent sans dépenser le moindre effort. Mais si vous avez perdu ces commits (par exemple parce que vous avez collecté votre dépôt entre-temps, ou parce que c'est un clone récent), vous pouvez toujours rebaser la branche à nouveau. La clé pour cela est la fonction --onto interrupteur.

Disons que vous avez une branche de sujet appelée de manière imaginative topic que vous avez bifurqué master lorsque la pointe de master était le 0deadbeef commettre. A un moment donné, alors qu'il était sur le topic branche, vous avez fait git rebase master . Vous voulez maintenant annuler cette opération. Voici comment :

git rebase --onto 0deadbeef master topic

Cela prendra tous les commits sur topic qui ne sont pas sur master et les rejouer au dessus de 0deadbeef .

Avec --onto vous pouvez réarranger votre histoire en à peu près n'importe quelle forme .

Amusez-vous bien. :-)

75voto

Alex Gontmakher Points 714

En fait, je mets un tag de sauvegarde sur la branche avant d'effectuer toute opération non triviale (la plupart des rebases sont triviales, mais je le ferais si elle semble complexe).

Ensuite, la restauration est aussi simple que git reset --hard BACKUP .

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