Git - ¿Cómo arreglar una rebase interactiva "corrupta"?

184

Logré crear un pequeño desastre en mi repositorio local de git. Estaba tratando de arreglar un commit roto usando las siguientes instrucciones . Antes de ejecutar el "git commit --amend" (y después del git rebase --interactive) decidí que mis cambios eran incorrectos y ejecuté "git reset HEAD --hard". No es una buena idea, te lo digo.

Ahora el rebase interactivo parece estar "atascado". Git muestra la rama actual como (| REBASE-m). Cada comando (cd .., ls, git rebase ...) dentro de mi repositorio da el siguiente error:

cat: .git / rebase-merge / head-name: No existe tal archivo o directorio

Así es como se ve git rebase --abort:

$ git rebase --abort
cat: c:/_work/project/src/git/.git/rebase-merge/quiet: No such file or directory
cat: c:/_work/project/src/git/.git/rebase-merge/head-name: No such file or directory
cat: c:/_work/project/src/git/.git/rebase-merge/orig-head: No such file or directory
HEAD is now at 4c737fb Revert "Modified file names"
rm: cannot remove `c:/_work/project/src/git/.git/rebase-merge/done': Permission denied
rm: cannot remove directory `c:/_work/project/src/git/.git/rebase-merge': Directory
not empty
cat: .git/rebase-merge/head-name: No such file or directory

Aquí está el resultado de git rebase: continúe:

$ git rebase --continue
cat: c:/_work/project/src/git/.git/rebase-merge/prev_head: No such file or directory
cat: c:/_work/project/src/git/.git/rebase-merge/end: No such file or directory
cat: c:/_work/project/src/git/.git/rebase-merge/msgnum: No such file or directory
cat: c:/_work/project/src/git/.git/rebase-merge/onto: No such file or directory
cat: c:/_work/project/src/git/.git/rebase-merge/quiet: No such file or directory
prev_head must be defined
cat: .git/rebase-merge/head-name: No such file or directory

¿Algunas ideas? Me gustaría restablecer la situación al estado en que estaba antes de comenzar mi bien pensada operación de rebase.

Así es como git log --oneline muestra la situación:

4c737fb Revert "Modified file names"
247ac02 Modified file names
33141e6 Message modifications
10a4a04 Modified db script

Y esto está bien.

Estoy usando msysgit v1.7.0.2.

Mikael Koskinen
fuente
58
git rebase --quitfuncionó para mí
Juan Caicedo

Respuestas:

160

Parece que Git intentó eliminar el .git/rebase-mergedirectorio pero no pudo eliminarlo por completo. ¿Has intentado copiar esa carpeta? También copie la .git/rebase-applycarpeta si está presente.

Martin Owen
fuente
77
Gracias por señalar eso. Pude solucionar mi problema simplemente reiniciando la computadora. No estoy seguro de qué salió mal porque de alguna manera cada acceso a la carpeta .git \ rebase-merge causó un error de "Acceso denegado".
Mikael Koskinen
19
Reiniciar el sistema no funcionó para mí, pero git rebase --abort(de stackoverflow.com/a/4757777/146044 ) hizo el trabajo.
backus
3
Solo reiniciar el shell git (windows) funcionó para mí ( git rebase --abortno funcionaba)
mhand
44
una palabra de advertencia ... tuve 4 horas de cambios en mi directorio de trabajo cuando noté el error de rebase dañado. probé git rebase --aborty borró mis cambios no organizados ... aunque el error desapareció
George Ananda Eman
117
reiniciar o git rebase --aborttodavía me dio los errores. git rebase --quittrabajó para mi.
Flávio Rodrigues
198

Me quedé atrapado en esto. Creé el archivo de nombre de cabecera, y luego me encontré con otro error que decía que no podía encontrar el archivo, así que creé ese archivo. Luego recibí otro error que decía que no podía leer '.git / rebase-apply / onto': No existe tal archivo o directorio.

Así que miré la documentación de git para rebase y encontré otro comando:

git rebase --quit

Esto me devolvió a mi rama sin cambios, y pude comenzar mi rebase nuevamente, como nuevo.

Laura Slocum
fuente
51
git rebase --quit¡era que!
Steven Shaw
55
--quittrabajó. --abortno porque el rebase fue cancelado a mitad de camino
Kalob Taulien
1
Tuve un error similar relacionado con rebase, solo con un mensaje de error diferente. Probado: $ git rebase --abortSalida: error: could not read '.git/rebase-apply/head-name': No such file or directoryFinalmente, esta solución soluciona mi problema:git rebase --quit
aff
Votado git rebase --quitAbsolutamente me salvó. Los mismos síntomas que se describen, pero los míos aparecieron después de intentar hacer un git pull --rebase, que por alguna razón falló. Tenga en cuenta que tenía habilitado el autostash (git versión 2.27.0.windows.1) y tenía VS2019 ejecutándose (señaló ese repositorio) al mismo tiempo; sospecho que alguna combinación de estos lo estropeó.
ErrCode
90

Tuve un problema similar debido a un proceso zombie vim.exe. Matarlo en el Administrador de tareas, seguido de un git rebase --abortreparado.

usuario584317
fuente
Este fue mi problema también. Usé el handlecomando sysinternals y vi que un proceso (sh.exe) tenía el archivo bloqueado. El uso lo pskill <pid>arregló para mí.
Paul Oliver
Tuve el mismo problema, pero con Sublime Text para mí.
Toivo Säwén
35

Gracias @Laura Slocum por tu respuesta

Arruiné las cosas mientras rebase y obtuve un HEAD separado con

 error: could not read orig-head

eso me impidió terminar el rebase.

La CABEZA separada parece contener precisamente mi estado de rebase correcto, así que corrí

rebase --quit

y después de eso revisé una nueva rama temporal para unirla a la cabeza separada.

Al compararlo con la rama que quería reajustar, puedo ver que la nueva rama temporal está exactamente en el estado que quería alcanzar. Gracias

Piedad
fuente
7

Tuve el mismo problema en Eclipse. No se pudo Rebase => abortar de Eclipse.

Ejecutar git rebase --abort desde Git Bash Funcionó para mí.

Praveen Hiremath
fuente
7

En Windows, si no desea o no puede reiniciar la máquina, consulte a continuación.

Instale Process Explorer: https://technet.microsoft.com/en-us/sysinternals/bb896653.aspx

En el Explorador de procesos, Buscar> Identificador de archivo o DLL ...

Escriba el nombre del archivo mencionado en el error (para mi error fue 'git-rebase-todo' pero en la pregunta anterior, 'hecho').

Process Explorer resaltará el proceso manteniendo un bloqueo en el archivo (para mí fue 'grep').

Elimine el proceso y podrá abortar la acción git de la manera estándar.

Darren Yeats
fuente
5

Crea un archivo con este nombre:

touch .git/rebase-merge/head-name

y que usar git rebase

Tehila Dabush
fuente
3

En mi caso más fuerte git rebase --aborty git rebase --continueestaba tirando:

error: no se pudo leer '.git / rebase-apply / head-name': no ​​existe tal archivo o directorio

Logré solucionar este problema eliminando manualmente: .git\rebase-applydirectorio.

Dariusz
fuente
2

Estoy usando git version 2.19.2.windows.1.

lo único que funcionó para mí fue eliminar el .git/rebase-apply/directorio y hacer un git reset --hard.

Spongman
fuente
1

En mi caso, fue porque había abierto SmartGit's Log en el proyecto Git respectivo y Total Commander en el directorio del proyecto respectivo. Cuando cerré ambos pude volver a crear sin problemas.

Cuanto más lo pienso, más sospecho de Total Commander, es decir, Windows tiene un bloqueo en el directorio abierto con el que git rebase estaba tratando de hacer algo.

Consejo amistoso: cuando intente arreglar algo, siempre haga un cambio a la vez. ;)

meridius
fuente
1

He intentado todos los pasos anteriores mencionados pero nada funcionó para mí. Finalmente, reiniciar la computadora funcionó para este problema: D

Mohammed Asif
fuente
1

Con SublimeText 3 en Windows, el problema se soluciona simplemente cerrando las ventanas Sublime utilizadas para la edición interactiva de confirmación.

LeBorgne
fuente
0

Una vez que haya completado satisfactoriamente el rebase X número de confirmaciones, el último comando debe ser git rebase --continue. Eso completa el proceso y sale del modo rebase.

diptia
fuente
0

Yo tuve el mismo problema. Utilicé el explorador de procesos como se sugirió en otra publicación (no puedo encontrar esa publicación) y descubrí qué proceso tiene un bloqueo en el archivo y lo eliminé. luego ejecute --continue o --abort según las necesidades

usuario3739537
fuente
0

En mi caso, después de probar todas estas opciones y aún tener problemas, probé sudo git rebase --aborte hizo todo

Dani.Rangelov
fuente
Tenga cuidado si está haciendo esto en medio de un rebase real. Acabo de perder mis cambios: '(
Freeman L
Fue considerado "corrompido", entonces comienzas de nuevo con el rebase
Dani.Rangelov
0

Probé todo lo demás excepto un reinicio, lo que funcionó para mí es rm -fr .git/REBASE_HEAD

Jeremy Vaught
fuente
0

Si se encuentra por debajo del estado y el rebase ya no funciona,

$ git status
rebase in progress; onto (null)
You are currently rebasing.
  (all conflicts fixed: run "git rebase --continue")

Entonces primero corre,

$ git rebase -quit

Y luego restaurar el estado anterior de reflog,

$ git reflog
97f7c6f (HEAD, origin/master, origin/HEAD) HEAD@{0}: pull --rebase: checkout 97f7c6f292d995b2925c2ea036bb4823a856e1aa
4035795 (master) HEAD@{1}: commit (amend): Adding 2nd commit
d16be84 HEAD@{2}: commit (amend): Adding 2nd commit
8577ca8 HEAD@{3}: commit: Adding 2nd commit
3d2088d HEAD@{4}: reset: moving to head~
52eec4a HEAD@{5}: commit: Adding initial commit

Utilizando,

$ git checkout HEAD@{1} #or
$ git checkout master #or
$ git checkout 4035795 #or
Sazzad Hissain Khan
fuente
-3

Estoy usando git en eclipse y estaba teniendo el mismo problema.

Finalmente descubrí que la entrada del menú "Rebase ..." se transformó temporalmente en un submenú.

Equipo-> Rebase -> Abortar

Funcionó para mi.

Shiva Agrawal
fuente