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.


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.


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.


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.


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


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.


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.


5

Crie um arquivo com este nome:

touch .git/rebase-merge/head-name

e que usar git rebase


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 :.


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.


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. ;)


1

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


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.


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.


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


0

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


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


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

-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.

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.