Git - Como corrigir rebase interativa "corrompida"?

184

Eu consegui criar uma pequena bagunça no meu repositório git local. Eu estava tentando corrigir um commit quebrado usando as seguintes instruções . Antes de executar o "git commit --amend" (e após o git rebase --interactive), decidi que minhas alterações estavam incorretas e executei o "git reset HEAD --hard". Não é uma boa ideia, eu lhe digo.

Agora, o rebase interativo parece estar "travado". Git mostra o ramo atual como (| REBASE-m). Todo comando (cd .., ls, git rebase ...) dentro do meu repositório gera o seguinte erro:

cat: .git / rebase-merge / head-name: esse arquivo ou diretório não existe

Aqui está como o git rebase --abort se parece:

$ 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

Aqui está o resultado do git rebase --continue:

$ 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

Alguma ideia? Gostaria de redefinir a situação para o estado em que estava antes de iniciar minha bem-pensada operação de rebase.

Aqui está como o git log --oneline mostra a situação:

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

E isso é bom.

Estou usando o msysgit v1.7.0.2.

Mikael Koskinen
fonte
58
git rebase --quittrabalhou para mim
Juan Caicedo

Respostas:

160

Parece que o Git tentou remover o .git/rebase-mergediretório, mas não conseguiu removê-lo completamente. Você já tentou copiar essa pasta? Copie também a .git/rebase-applypasta, se houver.

Martin Owen
fonte
7
Obrigado por apontar isso. Consegui corrigir o meu problema apenas reiniciando o computador. Não tenho certeza do que deu errado, porque, de alguma forma, todo acesso à pasta .git \ rebase-merge causou um erro "Acesso negado".
Mikael Koskinen
19
Reinicialização não funcionou para mim, mas git rebase --abort(de stackoverflow.com/a/4757777/146044 ) fez trabalho.
backus
3
Apenas reiniciar o shell git (windows) trabalhou para mim ( git rebase --abortnão estava funcionando)
mhand
4
uma palavra de aviso ... eu tinha 4 horas no valor de alterações no meu diretório de trabalho quando notei o erro rebase corrompido. tentou o git rebase --abortlimpou minhas alterações unstaged ... o erro não desapareceu embora
George Ananda Eman
117
reiniciar ou git rebase --abortainda me deu os erros. git rebase --quittrabalhou para mim.
Flávio Rodrigues
198

Eu fiquei preso nisso. Criei o arquivo head-name e, em seguida, encontrei outro erro dizendo que não conseguia encontrar o arquivo on, então criei esse arquivo. Em seguida, recebi outro erro dizendo que não era possível ler '.git / rebase-apply / into': esse arquivo ou diretório não existe.

Então , olhei a documentação do git para rebasing e encontrei outro comando:

git rebase --quit

Isso me colocou de volta na minha ramificação, sem alterações, e eu poderia começar a minha reformulação novamente, como nova.

Laura Slocum
fonte
51
git rebase --quitfoi isso!
Steven Shaw
5
--quittrabalhou. --abortnão, porque o rebase foi cancelado no meio do caminho
Kalob Taulien 27/09/19
1
Eu tive um erro semelhante ao rebase, apenas com uma mensagem de erro diferente. Tentei: $ git rebase --abortSaída: error: could not read '.git/rebase-apply/head-name': No such file or directoryFinalmente, esta solução corrige meu problema:git rebase --quit
aff
Votado. git rebase --quitabsolutamente me salvou. Mesmos sintomas descritos, mas o meu veio depois de tentar fazer um git pull --rebase, que por algum motivo falhou. Observe que eu tinha o autostash ativado (versão 2.27.0.windows.1 do git) e o VS2019 estava em execução (apontado para esse repositório) ao mesmo tempo - suspeite que alguma combinação desses tenha estragado tudo.
ErrCode 10/06
90

Eu tive um problema semelhante devido a um processo do zombie vim.exe. Matá-lo no Gerenciador de Tarefas, seguido de uma git rebase --abortcorreção.

user584317
fonte
esse também era meu problema. Eu usei o handlecomando sysinternals e vi que um processo (sh.exe) tinha o arquivo bloqueado. Usando pskill <pid>fixo para mim.
Paul Oliver
Eu tive o mesmo problema, mas com o Sublime Text para mim.
Toivo Säwén 19/01
35

Obrigado @Laura Slocum pela sua resposta

Eu errei as coisas enquanto refazendo e tenho uma CABEÇA desapegada com um

 error: could not read orig-head

isso me impediu de terminar o rebase.

O HEAD desanexado parece conter precisamente meu estado desejado de rebase correto, então eu corri

rebase --quit

e depois disso, verifiquei um novo ramo temporário para vinculá-lo à cabeça desanexada.

Comparando-o com o ramo que eu queria refazer, posso ver que o novo ramo temporário está exatamente no estado que eu queria alcançar. obrigado

Ruth
fonte
7

Teve o mesmo problema no Eclipse. Não foi possível rebase => abortar do Eclipse.

Executar o git rebase --abort do Git Bash funcionou para mim.

Praveen Hiremath
fonte
7

No Windows, se você não estiver disposto ou não conseguir reiniciar a máquina, veja abaixo.

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

No Process Explorer, localize> Identificador de arquivo ou DLL ...

Digite o nome do arquivo mencionado no erro (para o meu erro foi 'git-rebase-todo', mas na pergunta acima, 'pronto').

O Process Explorer destacará o processo mantendo um bloqueio no arquivo (para mim era 'grep').

Finalize o processo e você poderá abortar a ação git da maneira padrão.

Darren Yeats
fonte
5

Crie um arquivo com este nome:

touch .git/rebase-merge/head-name

e que usar git rebase

Tehila Dabush
fonte
3

No meu caso, eighter git rebase --aborte git rebase --continueestava jogando:

erro: não foi possível ler '.git / rebase-apply / head-name': esse arquivo ou diretório não existe

Eu consegui corrigir esse problema removendo manualmente o .git\rebase-applydiretório :.

Dariusz
fonte
2

Estou usando git version 2.19.2.windows.1.

a única coisa que funcionou para mim foi remover o .git/rebase-apply/diretório e executar um git reset --hard.

Spongman
fonte
1

No meu caso, foi porque eu abri o Log do SmartGit no respectivo projeto Git e o Total Commander no respectivo diretório do projeto. Quando fechei os dois, consegui me recuperar novamente sem nenhum problema.

Quanto mais eu penso sobre isso, mais suspeito do Total Commander, ou seja, o Windows tendo um bloqueio no diretório aberto com o qual o rebit git estava tentando algo.

Conselho amigável: Ao tentar corrigir algo, sempre faça uma alteração de cada vez. ;)

meridius
fonte
1

Eu tentei todas as etapas acima mencionadas, mas nada funcionou para mim. Por fim, reiniciar o computador funcionou para esse problema: D

Mohammed Asif
fonte
1

Com o SublimeText 3 no Windows, o problema é corrigido apenas fechando as janelas do Sublime usadas para a edição de confirmação interativa.

LeBorgne
fonte
0

Depois de concluir satisfatoriamente o rebasing do número X de confirmações, o último comando deve ser git rebase --continue. Isso conclui o processo e sai do modo rebase.

diptia
fonte
0

Eu tive o mesmo problema. Eu usei o Process Explorer como sugerido em outro post (não consigo encontrar esse post) e descobri qual processo tem um bloqueio no arquivo e o mata. execute o --continue ou --abort conforme as necessidades

user3739537
fonte
0

No meu caso, depois de testar todas essas opções e ainda ter problemas, tentei sudo git rebase --aborte fez a coisa toda

Dani.Rangelov
fonte
Tenha cuidado se você estiver fazendo isso no meio de uma rebase real. Acabei de perder minhas alterações: '(
Freeman L
Considerou-se "corrompido", então você começar de novo com o rebase
Dani.Rangelov
0

tentei de tudo, menos uma reinicialização, o que funcionou para mim é rm -fr .git/REBASE_HEAD

Jeremy Vaught
fonte
0

Se você ficar abaixo do estado e rebase não funcionar mais,

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

Então primeiro corra,

$ git rebase -quit

E, em seguida, restaure o estado anterior do 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

Usando,

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

Estou usando o git no eclipse e estava tendo o mesmo problema.

Eventualmente, descobri que a entrada do menu "Rebase ..." foi transformada temporariamente em um submenu.

Equipe-> Rebase -> Abortar

Funcionou para mim.

Shiva Agrawal
fonte