Git - Come riparare rebase interattivo "corrotto"?


184

Sono riuscito a creare un po 'di confusione nel mio repository git locale. Stavo cercando di correggere un commit interrotto usando le seguenti istruzioni . Prima di eseguire "git commit --amend" (e dopo git rebase --interactive) ho deciso che le mie modifiche erano errate e quindi ho eseguito "git reset HEAD --hard". Non è una buona idea, te lo dico.

Ora il rebase interattivo sembra essere "bloccato". Git mostra il ramo corrente come (| REBASE-m). Ogni comando (cd .., ls, git rebase ...) all'interno del mio repository dà il seguente errore:

cat: .git / rebase-merge / head-name: nessun file o directory

Ecco come appare 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

Ecco il risultato di git rebase --continua:

$ 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

Qualche idea? Vorrei ripristinare la situazione allo stato in cui si trovava prima di iniziare la mia operazione di rebase ben ponderata.

Ecco come git log --oneline mostra la situazione:

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

E questo va bene.

Sto usando msysgit v1.7.0.2.


58
git rebase --quitha funzionato per me
Juan Caicedo il

Risposte:


160

Sembra che Git abbia provato a rimuovere la .git/rebase-mergedirectory ma non è stato in grado di rimuoverla completamente. Hai provato a copiare quella cartella? Copiare anche la .git/rebase-applycartella se è presente.


7
Grazie per la segnalazione. Sono stato in grado di risolvere il mio problema semplicemente riavviando il computer. Non sono sicuro di cosa sia andato storto perché in qualche modo ogni accesso alla cartella .git \ rebase-merge ha causato un errore "Accesso negato".
Mikael Koskinen,

19
Il riavvio non ha funzionato per me ma git rebase --abort(da stackoverflow.com/a/4757777/146044 ) ha funzionato.
backus,

3
Il riavvio della shell git (windows) ha funzionato per me ( git rebase --abortnon funzionava)
mhand

4
un avvertimento ... ho avuto 4 ore di modifiche sulla mia directory di lavoro quando ho notato l'errore rebase danneggiato. git rebase --abortho provato a cancellare i miei cambiamenti non messi in scena ... ma l'errore è scomparso
George Ananda Eman,

117
riavvio o git rebase --abortancora mi ha dato gli errori. git rebase --quitha funzionato per me.
Flávio Rodrigues,

198

Mi sono bloccato in questo. Ho creato il file del nome principale, quindi ho riscontrato un altro errore che diceva che non è stato possibile trovare il file into, quindi ho creato quel file. Poi ho ricevuto un altro errore dicendo che non riuscivo a leggere '.git / rebase-apply / into': nessun file o directory.

Quindi ho guardato la documentazione git per il rebasing e ho trovato un altro comando:

git rebase --quit

Questo mi ha riportato sul mio ramo senza cambiamenti e ho potuto ricominciare da capo, come nuovo.


51
git rebase --quitera!
Steven Shaw,

5
--quitlavorato. --abortnon perché il rebase fu cancellato a metà strada
Kalob Taulien il

1
Ho avuto un errore simile a rebase, solo con un messaggio di errore diverso. Provato: $ git rebase --abortOutput: error: could not read '.git/rebase-apply/head-name': No such file or directoryInfine, questa soluzione risolve il mio problema:git rebase --quit
aff

Upvoted. git rebase --quitmi ha assolutamente salvato. Stessi sintomi descritti, ma i miei sono arrivati ​​dopo aver provato a fare un git pull --rebase, che per qualche ragione è fallito. Nota avevo abilitato l'autashash automatico (versione git 2.27.0.windows.1) e avevo VS2019 in esecuzione (puntato su quel repository) allo stesso tempo - sospetto che una combinazione di questi lo abbia incasinato.
ErrCode

90

Ho avuto un problema simile a causa di un processo zombie vim.exe. Uccidendolo in Task Manager, seguito da un git rebase --abortrisolto.


anche questo era il mio problema. Ho usato il handlecomando sysinternals e ho visto che un processo (sh.exe) aveva il file bloccato. Usandolo pskill <pid>riparato per me.
Paul Oliver,

Ho avuto lo stesso problema, ma con Sublime Text per me.
Toivo Säwén

35

Grazie @Laura Slocum per la tua risposta

Ho incasinato le cose durante la rigenerazione e ho ottenuto una TESTA distaccata con un

 error: could not read orig-head

che mi ha impedito di finire il rebasing.

La testa staccata sembra contenere esattamente il mio stato desiderato di rebase corretto, quindi ho corso

rebase --quit

e dopo ho controllato un nuovo ramo temporaneo per legarlo alla testa staccata.

Confrontandolo con il ramo che volevo rifare, posso vedere che il nuovo ramo temporaneo è esattamente nello stato che volevo raggiungere. Grazie


7

Ha avuto lo stesso problema in Eclipse. Impossibile ripristinare => annullare da Eclipse.

Esecuzione di git rebase --abort da Git Bash Ha funzionato per me.


7

Su Windows, se non si desidera o non è possibile riavviare la macchina, vedere di seguito.

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

In Process Explorer, trova> Gestione file o DLL ...

Digita il nome del file menzionato nell'errore (per il mio errore era 'git-rebase-todo' ma nella domanda sopra, 'fatto').

Process Explorer evidenzierà il processo con un blocco sul file (per me era 'grep').

Uccidi il processo e sarai in grado di interrompere l'azione git in modo standard.


5

Crea un file con questo nome:

touch .git/rebase-merge/head-name

e che usare git rebase


3

Nel mio caso più intenso git rebase --aborte git rebase --continuestava lanciando:

errore: impossibile leggere '.git / rebase-apply / head-name': nessun file o directory

Sono riuscito a risolvere questo problema rimuovendo manualmente: .git\rebase-applydirectory.


2

sto usando git version 2.19.2.windows.1 .

l'unica cosa che ha funzionato per me era rimuovere la .git/rebase-apply/directory e fare un git reset --hard.


1

Nel mio caso è stato perché avevo aperto Log di SmartGit nel rispettivo progetto Git e Total Commander nella rispettiva directory del progetto. Quando ho chiuso entrambi sono stato in grado di rifare senza problemi.

Più ci penso, più sospetto che Total Commander, ovvero Windows abbia un blocco sulla directory aperta con cui git rebase stava cercando di fare qualcosa.

Consiglio amichevole: quando provi a riparare qualcosa, fai sempre una modifica alla volta. ;)


1

Ho provato tutti i passaggi sopra menzionati ma nulla ha funzionato per me. Infine, il riavvio del computer ha funzionato per questo problema: D


1

Con SublimeText 3 su Windows, il problema viene risolto semplicemente chiudendo le finestre Sublime utilizzate per l'edizione interattiva del commit.


0

Dopo aver completato in modo soddisfacente la ridistribuzione del numero X di commit, l'ultimo comando deve essere git rebase --continue. Questo completa il processo ed esce dalla modalità rebase.


0

Ho avuto lo stesso problema. Ho usato Process Explorer come suggerito in altri post (non sono in grado di trovare quel post) e ho capito quale processo ha un blocco sul file e l'ho ucciso. quindi eseguire --continue o --abort secondo necessità


0

Nel mio caso dopo aver testato tutte queste opzioni e avendo ancora problemi ho provato sudo git rebase --aborte ha fatto tutto


Fai attenzione se lo stai facendo nel mezzo di un rebase reale. Ho appena perso i miei cambiamenti: '(
Freeman L

È stato considerato "corrotto", quindi si ricomincia da capo con il rebase
Dani.Rangelov,

0

provato tutto il resto tranne un riavvio, quello che ha funzionato per me è rm -fr .git/REBASE_HEAD


0

Se si scende sotto state e rebase non funziona più,

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

Quindi prima corsa,

$ git rebase -quit

E quindi ripristinare lo stato precedente dal 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

utilizzando,

$ git checkout HEAD@{1} #or
$ git checkout master #or
$ git checkout 4035795 #or

-3

Sto usando git in eclipse e ho avuto lo stesso problema.

Alla fine ho scoperto che la voce di menu "Rebase ..." è stata temporaneamente trasformata in un sottomenu.

Squadra-> Rebase -> Annulla

Ha funzionato per me.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.