Cancelar completamente un rebase

256

Realicé un rebase como este:

git rebase --onto master new_background_processing export_background_processing

Eso no hizo lo que quería, así que realicé un reinicio:

git reset --hard HEAD@{1}

Regresé mi sucursal al estado en que estaba, pero recibí este mensaje cuando escribí git status:

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

¿Cómo cancelo esa rebase por completo? No estoy seguro de lo que eso significa per se.

Graham Jackson
fuente
16
git rebase --abort
Micha Wiedenmann
66
Git 2.12 ahora proporciona git rebase --quit. Vea mi respuesta a continuación
VonC

Respuestas:

409

Uso git rebase --abort. De la documentación oficial del kernel de Linux paragit rebase :

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

fuente
55
En mi caso, el git rebase --abortno funcionó, porque estropeé algo. Sólo tengo error siguiente: error: could not read '.git/rebase-apply/head-name': directory of file does not exist. El git rebase --quit bramido descrito resolvió mi problema.
Kout
84

En el caso de un rebase anterior que no abortó correctamente, ahora (Git 2.12, Q1 2017) tiene git rebase --quit

Ver commit 9512177 (12 de noviembre de 2016) por Nguyễn Thái Ngọc Duy ( pclouds) . (Fusionada por Junio ​​C Hamano - gitster- en commit 06cd5a1 , 19 dic 2016)

rebase: agregar --quita la limpieza rebase, dejar todo lo demás intacto

Hay ocasiones en las que decide abortar un rebase en curso y pasar a hacer otra cosa, pero se olvida de hacer " git rebase --abort" primero . O el rebase ha estado en progreso durante tanto tiempo que lo olvidó. En el momento en que te das cuenta de que (por ejemplo, al comenzar otro rebase) ya es demasiado tarde para volver sobre tus pasos. La solución es normalmente

rm -r .git/<some rebase dir>

y continúa con tu vida.
Pero podría haber dos directorios diferentes <some rebase dir>(y obviamente requiere algún conocimiento de cómo funciona el rebase), y la parte " .git" podría ser mucho más larga si no está en el directorio superior o en un árbol de trabajo vinculado. Y " rm -r" es muy peligroso .git, un error podría destruir la base de datos de objetos u otros datos importantes.

Proporcione " git rebase --quit" para este caso de uso, imitando un precedente que es " git cherry-pick --quit".


Antes de Git 2.27 (Q2 2020), la entrada oculta creada por " git merge --autostash" para mantener el estado sucio inicial se descartó por error en " git rebase --quit", que se ha corregido.

Ver commit 9b2df3e (28 de abril de 2020) por Denton Liu ( Denton-L) .
(Fusionada por Junio ​​C Hamano - gitster- en commit 3afdeef , 29 abr 2020)

rebase: guardar la entrada de autostash en stash reflogon--quit

Firmado por: Denton Liu

En a03b55530a (" merge: teach --autostash option", 2020-04-07, Git v2.27.0 - merge enumerado en el lote # 5 ), --autostashse introdujo la opción git merge.

(Consulte " ¿Puede" git pull"esconder y reventar automáticamente los cambios pendientes? ")

En particular, cuando git merge --quitse ejecuta con una entrada de autostash presente, se guarda en el registro de escondite.

Esto contrasta con el comportamiento actual de git rebase --quitdonde la entrada de autostash simplemente se elimina de la existencia.

Adopte el comportamiento de git merge --quitin git rebase --quity guarde la entrada de autostash en el registro de alijo en lugar de simplemente eliminarlo.

VonC
fuente
3
Esto es muy útil para evitar el efecto secundario de restablecer el directorio de trabajo cuando se realizan cambios encima de a git rebase, en lugar de perderlos como acabo de hacer: P.
Warlike Chimpanzee
12

Tienes suerte de no haber completado el rebase, por lo que aún puedes hacerlo git rebase --abort. Si hubiera completado el rebase ( reescribe la historia ), las cosas habrían sido mucho más complejas. Considere etiquetar las puntas de las ramas antes de realizar operaciones potencialmente dañinas (particularmente la reescritura del historial), de esa manera puede rebobinar si algo explota.

vonbrand
fuente
8

Si está "Rebasando" , "Ya comenzó el rebase" que desea cancelar , simplemente comente(#) todas las confirmaciones enumeradas en el editor de rebase.

Como resultado, recibirá un mensaje de línea de comando

Nothing to do
Almas Adilbek
fuente