Git - Comment réparer le rebase interactif «corrompu»?

199

J'ai réussi à créer un petit désordre dans mon dépôt git local. J'essayais de réparer un commit cassé en utilisant les instructions suivantes . Avant d'exécuter le "git commit --amend" (et après le git rebase --interactive) j'ai décidé que mes modifications étaient incorrectes et j'ai donc exécuté "git reset HEAD --hard". Pas une bonne idée, je vous dis.

Maintenant, le rebase interactif semble être "bloqué". Git affiche la branche actuelle comme (| REBASE-m). Chaque commande (cd .., ls, git rebase ...) à l'intérieur de mon référentiel donne l'erreur suivante:

cat: .git / rebase-merge / head-name: aucun fichier ou répertoire de ce type

Voici à quoi ressemble 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

Voici le résultat de 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

Des idées? Je voudrais réinitialiser la situation à l'état où elle était avant de commencer mon opération de rebase bien pensée.

Voici comment git log --oneline montre la situation:

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

Et c'est bien.

J'utilise msysgit v1.7.0.2.

Mikael Koskinen
la source
73
git rebase --quittravaillé pour moi
Juan Caicedo

Réponses:

171

Il semble que Git a essayé de supprimer le .git/rebase-mergerépertoire mais n'a pas pu le supprimer complètement. Avez-vous essayé de copier ce dossier? Copiez également le .git/rebase-applydossier si celui-ci est présent.

Martin Owen
la source
7
Merci d'avoir fait remarquer cela. J'ai pu résoudre mon problème simplement en redémarrant l'ordinateur. Je ne suis pas sûr de ce qui s'est mal passé car chaque accès au dossier .git \ rebase-merge a provoqué une erreur "Accès refusé".
Mikael Koskinen
20
Le redémarrage n'a pas fonctionné pour moi mais git rebase --abort(à partir de stackoverflow.com/a/4757777/146044 ) a fonctionné.
backus
5
Le simple redémarrage du shell git (Windows) a fonctionné pour moi ( git rebase --abortne fonctionnait pas)
mhand
4
un mot d'avertissement ... j'ai eu 4 heures de modifications sur mon répertoire de travail lorsque j'ai remarqué l'erreur de rebase corrompue. essayé git rebase --abortil a effacé mes modifications non mises en scène ... l'erreur a cependant disparu
George Ananda Eman
128
redémarrage ou git rebase --abortm'a encore donné les erreurs. git rebase --quittravaillé pour moi.
Flávio Rodrigues
252

Je suis resté coincé là-dedans. J'ai créé le fichier de nom de tête, puis j'ai rencontré une autre erreur disant qu'il ne pouvait pas trouver le fichier sur, alors j'ai créé ce fichier. Ensuite, j'ai eu une autre erreur disant que je ne pouvais pas lire «.git / rebase-apply / on»: aucun fichier ou répertoire de ce type.

J'ai donc regardé la documentation de git pour le rebasage et j'ai trouvé une autre commande:

git rebase --quit

Cela m'a remis sur ma branche sans changement, et j'ai pu recommencer mon rebase, comme neuf.

Laura Slocum
la source
58
git rebase --quitétait-ce!
Steven Shaw
10
--quittravaillé. --abortpas parce que le rebase a été annulé à mi-chemin
Kalob Taulien
2
J'ai eu une erreur similaire liée au rebase, juste avec un message d'erreur différent. Essayé: $ git rebase --abortSortie: error: could not read '.git/rebase-apply/head-name': No such file or directoryEnfin, cette solution résout mon problème:git rebase --quit
aff
1
J'ai voté pour. git rebase --quitm'a absolument sauvé. Mêmes symptômes que ceux décrits, mais le mien est venu après avoir essayé de faire un git pull --rebase, qui pour une raison quelconque a échoué. Remarque J'avais activé l'autostash (git version 2.27.0.windows.1) et VS2019 en cours d'exécution (pointé sur ce dépôt) en même temps - soupçonnez qu'une combinaison de ces éléments a gâché.
ErrCode
1git rebase --quit // ça marche
Samet ÖZTOPRAK
90

J'ai eu un problème similaire en raison d'un processus zombie vim.exe. Tuer dans le Gestionnaire des tâches, suivi d'une git rebase --abortcorrection.

user584317
la source
c'était aussi mon problème. J'ai utilisé la handlecommande sysinternals et j'ai vu qu'un processus (sh.exe) avait le fichier verrouillé. Utilisation pskill <pid>fixe pour moi.
Paul Oliver
J'ai eu le même problème, mais avec Sublime Text pour moi.
Toivo Säwén le
36

Merci @Laura Slocum pour votre réponse

J'ai gâché les choses en rebasant et j'ai obtenu une tête détachée avec un

 error: could not read orig-head

cela m'a empêché de terminer le rebasage.

La tête détachée semble contenir précisément mon état souhaité de rebase correct, alors j'ai couru

rebase --quit

et après cela, j'ai vérifié une nouvelle branche temporaire pour la lier à la tête détachée.

En la comparant avec la branche que je voulais rebaser, je peux voir que la nouvelle branche temporaire est exactement dans l'état que je voulais atteindre. Merci

Ruth
la source
7

Eu le même problème dans Eclipse. Impossible de Rebase => abandonner Eclipse.

L'exécution de git rebase --abort à partir de Git Bash a fonctionné pour moi.

Praveen Hiremath
la source
7

Sous Windows, si vous ne souhaitez pas ou ne pouvez pas redémarrer la machine, voir ci-dessous.

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

Dans Process Explorer, Rechercher> File Handle ou DLL ...

Tapez le nom de fichier mentionné dans l'erreur (pour mon erreur, c'était 'git-rebase-todo' mais dans la question ci-dessus, 'done')

Process Explorer mettra en évidence le processus tenant un verrou sur le fichier (pour moi, c'était «grep»).

Tuez le processus et vous pourrez abandonner l'action git de la manière standard.

Darren Yeats
la source
5

Créez un fichier avec ce nom:

touch .git/rebase-merge/head-name

et que d'utiliser git rebase

Tehila Dabush
la source
3

Dans mon cas, huit git rebase --abortet git rebase --continuejette:

erreur: impossible de lire «.git / rebase-apply / head-name»: aucun fichier ou répertoire de ce type

J'ai réussi à résoudre ce problème en supprimant manuellement: .git\rebase-applyrépertoire.

Dariusz
la source
2

J'utilise git version 2.19.2.windows.1.

la seule chose qui a fonctionné pour moi était de supprimer le .git/rebase-apply/répertoire et de faire un fichier git reset --hard.

Spongman
la source
1

Dans mon cas, c'était parce que j'avais ouvert le journal de SmartGit dans le projet Git respectif et Total Commander dans le répertoire de projet respectif. Quand j'ai fermé les deux, j'ai pu rebaser sans aucun problème.

Plus j'y pense, plus je soupçonne Total Commander, c'est-à-dire que Windows a un verrou sur le répertoire ouvert avec lequel git rebase essayait de faire quelque chose.

Conseil amical: lorsque vous essayez de réparer quelque chose, faites toujours un changement à la fois. ;)

meridius
la source
1

J'ai essayé toutes les étapes mentionnées ci-dessus mais rien n'a fonctionné pour moi. Enfin, le redémarrage de l'ordinateur a fonctionné pour ce problème: D

Mohammed Asif
la source
1

Avec SublimeText 3 sous Windows, le problème est résolu en fermant simplement les fenêtres Sublime utilisées pour l'édition de validation interactive.

LeBorgne
la source
1

Si vous obtenez en dessous de l'état et que le rebase ne fonctionne plus,

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

Puis première course,

$ git rebase -quit

Et puis restaurer l'état précédent 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

En utilisant,

$ git checkout HEAD@{1} #or
$ git checkout master #or
$ git checkout 4035795 #or
Sazzad Hissain Khan
la source
0

Une fois que vous avez correctement rebasé X nombre de commits, la dernière commande doit être git rebase --continue. Cela termine le processus et quitte le mode rebase.

diptie
la source
0

J'ai eu le même problème. J'ai utilisé l'explorateur de processus comme suggéré dans un autre article (je ne suis pas en mesure de trouver ce message) et j'ai déterminé quel processus a un verrou sur le fichier et le tuer. puis exécutez le --continue ou --abort selon les besoins

user3739537
la source
0

Dans mon cas, après avoir testé toutes ces options et avoir toujours des problèmes, j'ai essayé sudo git rebase --abortet cela a tout fait

Dani.Rangelov
la source
Faites attention si vous faites cela au milieu d'un rebase réel. Je viens de perdre mes modifications: '(
Freeman L
Il a été considéré comme "corrompu", puis vous recommencez avec le rebase
Dani.Rangelov
0

essayé tout le reste sauf un redémarrage, ce qui a fonctionné pour moi est rm -fr .git/REBASE_HEAD

Jeremy Vaught
la source
-3

J'utilise git dans eclipse et j'avais le même problème.

Finalement, j'ai trouvé que l'entrée de menu "Rebase ..." était temporairement transformée en sous-menu.

Équipe-> Rebase -> Abandonner

Cela a fonctionné pour moi.

Shiva Agrawal
la source