Annuler complètement un rebasage

256

J'ai effectué un rebase comme celui-ci:

git rebase --onto master new_background_processing export_background_processing

Cela n'a pas fait ce que je voulais, j'ai donc effectué une réinitialisation:

git reset --hard HEAD@{1}

J'ai rétabli ma succursale dans l'état où elle était, mais j'ai reçu ce message lorsque je tape git status:

# You are currently rebasing branch 'export_background_processing' on 'e378641'.

Comment annuler complètement ce rebase? Je ne sais pas ce que cela signifie en soi.

Graham Jackson
la source
16
git rebase --abort
Micha Wiedenmann
6
Git 2.12 fournit maintenant git rebase --quit. Voir ma réponse ci
VonC

Réponses:

409

Utilisez git rebase --abort. De la documentation officielle du noyau Linux pourgit rebase :

git rebase --continue | --skip | --abort | --edit-todo

la source
5
Dans mon cas, cela git rebase --abortn'a pas fonctionné, car j'ai foiré quelque chose. Je ne suis erreur suivant: error: could not read '.git/rebase-apply/head-name': directory of file does not exist. Le git rebase --quit soufflet décrit a résolu mon problème.
Kout
84

Dans le cas d'un rebase passé que vous n'avez pas correctement avorté, vous avez maintenant (Git 2.12, T1 2017) git rebase --quit

Voir commit 9512177 (12 novembre 2016) de Nguyễn Thái Ngọc Duy ( pclouds) . (Fusionné par Junio ​​C Hamano - gitster- en commit 06cd5a1 , 19 déc 2016)

rebase: ajouter --quitau nettoyage rebaser, laisser tout le reste intact

Il y a des occasions où vous décidez d'interrompre un rebase en cours et de passer à autre chose mais vous oubliez de faire " git rebase --abort" d'abord . Ou le rebase est en cours depuis si longtemps que vous l'avez oublié. Au moment où vous réalisez que (par exemple en commençant une autre rebase), il est déjà trop tard pour revenir sur vos pas. La solution est normalement

rm -r .git/<some rebase dir>

et continue ta vie.
Mais il pourrait y avoir deux répertoires différents pour <some rebase dir>(et cela nécessite évidemment une certaine connaissance du fonctionnement du rebase), et la .gitpartie " " pourrait être beaucoup plus longue si vous n'êtes pas dans top-dir, ou dans un arbre de travail lié. Et " rm -r" est très dangereux de le faire .git, une erreur pourrait détruire la base de données d'objets ou d'autres données importantes.

Fournissez " git rebase --quit" pour ce cas d'utilisation, en imitant un précédent qui est " git cherry-pick --quit".


Avant Git 2.27 (Q2 2020), l'entrée de stash créée par " git merge --autostash" pour conserver l'état sale initial était supprimée par erreur lors de " git rebase --quit", ce qui a été corrigé.

Voir commit 9b2df3e (28 avril 2020) par Denton Liu ( Denton-L) .
(Fusionné par Junio ​​C Hamano - gitster- en commit 3afdeef , 29 avr 2020)

rebase: enregistrer l'entrée de la sauvegarde automatique dans stash reflogle--quit

Signé par: Denton Liu

Dans a03b55530a (" merge: teach --autostash option", 2020-04-07, Git v2.27.0 - fusion listée dans le lot # 5 ), l' --autostashoption a été introduite pour git merge.

(Voir « Est-ce que« git pull» « peut-il automatiquement cacher et faire apparaître les modifications en attente? »)

En particulier, lorsqu'il git merge --quitest exécuté avec une entrée de stockage automatique présente, il est enregistré dans le reflog de stockage.

Cela contraste avec le comportement actuel git rebase --quitoù l'entrée de la sauvegarde automatique est tout simplement supprimée.

Adoptez le comportement de git merge --quitin git rebase --quitet enregistrez l'entrée autostash dans le reflog stash au lieu de simplement la supprimer.

VonC
la source
3
Ceci est très utile pour éviter l'effet secondaire de réinitialiser le répertoire de travail lorsque des modifications sont apportées au-dessus d'un git rebase, au lieu de les perdre comme je viens de le faire: P.
Warlike Chimpanzee
12

Vous avez de la chance de ne pas avoir terminé le rebase, vous pouvez donc continuer git rebase --abort. Si vous aviez terminé le rebase (il réécrit l'histoire ), les choses auraient été beaucoup plus complexes. Envisagez de baliser les pointes des branches avant d'effectuer des opérations potentiellement dommageables (en particulier la réécriture de l'historique), de cette façon, vous pouvez rembobiner si quelque chose explose.

vonbrand
la source
8

Si vous "Rebase" , "Rebase déjà commencée" que vous souhaitez annuler , il suffit de commenter (#)toutes les validations répertoriées dans l'éditeur de rebase.

En conséquence, vous obtiendrez un message de ligne de commande

Nothing to do
Almas Adilbek
la source