Git - Wie kann man eine "beschädigte" interaktive Rebase reparieren?


181

Ich habe es geschafft, ein kleines Durcheinander in meinem lokalen Git-Repository zu verursachen. Ich habe versucht, ein fehlerhaftes Commit mithilfe der folgenden Anweisungen zu beheben . Vor dem Ausführen von "git commit --amend" (und nach der git rebase --interactive) habe ich festgestellt, dass meine Änderungen falsch sind, und daher "git reset HEAD --hard" ausgeführt. Keine gute Idee, sage ich dir.

Jetzt scheint die interaktive Rebase "hängen zu bleiben". Git zeigt den aktuellen Zweig als (| REBASE-m). Jeder Befehl (cd .., ls, git rebase ...) in meinem Repository gibt den folgenden Fehler aus:

cat: .git / rebase-merge / head-name: Keine solche Datei oder kein solches Verzeichnis

So sieht git rebase --abort aus:

$ 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

Hier ist das Ergebnis von git rebase - weiter:

$ 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

Irgendwelche Ideen? Ich möchte die Situation auf den Zustand zurücksetzen, in dem sie sich befand, bevor ich meine durchdachte Rebase-Operation gestartet habe.

So zeigt git log --oneline die Situation:

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

Und das ist gut so.

Ich verwende msysgit v1.7.0.2.


53
git rebase --quitarbeitete für mich
Juan Caicedo

Antworten:


156

Es sieht so aus, als hätte Git versucht, das .git/rebase-mergeVerzeichnis zu entfernen, konnte es jedoch nicht vollständig entfernen. Haben Sie versucht, diesen Ordner zu kopieren? Kopieren Sie auch den .git/rebase-applyOrdner, falls vorhanden.


7
Vielen Dank für den Hinweis. Ich konnte mein Problem beheben, indem ich den Computer neu startete. Ich bin nicht sicher, was schief gelaufen ist, da irgendwie jeder Zugriff auf den Ordner .git \ rebase-merge einen Fehler "Zugriff verweigert" verursachte.
Mikael Koskinen

19
Der Neustart hat bei mir nicht funktioniert, aber git rebase --abort(von stackoverflow.com/a/4757777/146044 ) hat funktioniert.
Backus

3
Nur ein Neustart der Git-Shell (Windows) funktionierte für mich ( git rebase --abortfunktionierte nicht)
mhand

2
Ein Wort der Warnung ... Ich hatte Änderungen in meinem Arbeitsverzeichnis im Wert von 4 Stunden, als ich den beschädigten Rebase-Fehler bemerkte. git rebase --abortIch habe versucht , meine nicht bereitgestellten Änderungen zu löschen ... der Fehler ist jedoch verschwunden
George Ananda Eman

113
Neustart oder git rebase --abortgab mir trotzdem die Fehler. git rebase --quitarbeitete für mich.
Flávio Rodrigues

188

Ich steckte darin fest. Ich habe die Kopfnamensdatei erstellt und bin dann auf einen anderen Fehler gestoßen, der besagt, dass die On-Datei nicht gefunden werden konnte. Deshalb habe ich diese Datei erstellt. Dann bekam ich einen weiteren Fehler, der besagte, dass '.git / rebase-apply / on' nicht gelesen werden konnte: Keine solche Datei oder kein solches Verzeichnis.

Also habe ich mir die Git- Dokumentation zum erneuten Basieren angesehen und einen anderen Befehl gefunden:

git rebase --quit

Dies brachte mich ohne Änderungen zurück in meinen Zweig und ich konnte meine Rebase wieder von vorne beginnen, so gut wie neu.


51
git rebase --quitwar es!
Steven Shaw

5
--quithat funktioniert. --abortnicht, weil die Rebase auf halbem Weg abgesagt wurde
Kalob Taulien

1
Ich hatte einen ähnlichen Rebase-Fehler, nur mit einer anderen Fehlermeldung. Versucht: $ git rebase --abortAusgabe: error: could not read '.git/rebase-apply/head-name': No such file or directorySchließlich behebt diese Lösung mein Problem:git rebase --quit
Aff

Upvoted. git rebase --quithat mich absolut gerettet. Gleiche Symptome wie beschrieben, aber meine traten auf, nachdem ich versucht hatte, eine zu machen git pull --rebase, was aus irgendeinem Grund fehlschlug. Hinweis: Ich hatte Autostash aktiviert (Git-Version 2.27.0.windows.1) und VS2019 gleichzeitig ausgeführt (auf dieses Repo gerichtet).
ErrCode

90

Ich hatte ein ähnliches Problem aufgrund eines zombie vim.exe-Prozesses. Beenden Sie es im Task-Manager, gefolgt von einem git rebase --abortFehler.


Das war auch mein Problem. Ich habe den handleBefehl sysinternals verwendet und festgestellt, dass bei einem Prozess (sh.exe) die Datei gesperrt war. Verwenden Sie pskill <pid>es für mich behoben.
Paul Oliver

Ich hatte das gleiche Problem, aber mit Sublime Text für mich.
Toivo Säwén

35

Danke @Laura Slocum für deine Antwort

Ich habe die Dinge beim Rebasieren durcheinander gebracht und einen abgetrennten KOPF mit einem bekommen

 error: could not read orig-head

das hinderte mich daran, die Umbasierung zu beenden.

Der abgetrennte KOPF scheint genau meinen korrekten gewünschten Basiszustand zu enthalten, also rannte ich

rebase --quit

und danach habe ich einen neuen temporären Zweig ausgecheckt, um ihn an den abgetrennten Kopf zu binden.

Wenn ich es mit dem Zweig vergleiche, den ich neu aufbauen wollte, kann ich sehen, dass der neue temporäre Zweig genau in dem Zustand ist, den ich erreichen wollte. Vielen Dank


7

Hatte das gleiche Problem in Eclipse. Rebase konnte nicht wiederhergestellt werden => von Eclipse abbrechen.

Das Ausführen von git rebase --abort von Git Bash hat für mich funktioniert .


7

Wenn Sie unter Windows nicht bereit oder nicht in der Lage sind, den Computer neu zu starten, siehe unten.

Installieren Sie den Prozess-Explorer: https://technet.microsoft.com/en-us/sysinternals/bb896653.aspx

Suchen Sie im Prozess-Explorer nach Suchen> Dateihandle oder DLL ...

Geben Sie den im Fehler genannten Dateinamen ein (für meinen Fehler war es 'git-rebase-todo', aber in der obigen Frage 'erledigt').

Der Prozess-Explorer hebt den Prozess hervor, der eine Sperre für die Datei enthält (für mich war es 'grep').

Wenn Sie den Prozess beenden, können Sie die Git-Aktion auf die übliche Weise abbrechen.


5

Erstellen Sie eine Datei mit diesem Namen:

touch .git/rebase-merge/head-name

und als verwenden git rebase


3

In meinem Fall leichter git rebase --abortund git rebase --continuewarf:

Fehler: '.git / rebase-apply / head-name' konnte nicht gelesen werden: Keine solche Datei oder kein solches Verzeichnis

Ich konnte dieses Problem beheben, indem ich das .git\rebase-applyVerzeichnis manuell entfernte .


1

In meinem Fall lag es daran, dass ich SmartGits Log im jeweiligen Git-Projekt und Total Commander im jeweiligen Projektverzeichnis geöffnet hatte. Als ich beide geschlossen habe, konnte ich problemlos wiederherstellen.

Je mehr ich darüber nachdenke, desto mehr vermute ich, dass Total Commander, dh Windows eine Sperre für das geöffnete Verzeichnis hat, mit dem die Git-Rebase etwas versucht hat.

Freundlicher Rat: Wenn Sie versuchen, etwas zu reparieren, nehmen Sie immer jeweils eine Änderung vor. ;)


1

Ich benutze git version 2.19.2.windows.1.

Das einzige, was für mich funktioniert hat, war das .git/rebase-apply/Verzeichnis zu entfernen und a git reset --hard.


1

Ich habe alle oben genannten Schritte ausprobiert, aber nichts hat bei mir funktioniert. Schließlich funktionierte der Neustart des Computers für dieses Problem: D.


1

Mit SublimeText 3 unter Windows wird das Problem behoben, indem nur die für die interaktive Commit-Edition verwendeten Sublime-Fenster geschlossen werden.


0

Sobald Sie die Neubasierung der X-Anzahl von Commits zufriedenstellend abgeschlossen haben, muss der letzte Befehl lauten git rebase --continue. Damit ist der Vorgang abgeschlossen und der Rebase-Modus wird beendet.


0

Ich hatte das gleiche Problem. Ich habe den Prozess-Explorer wie in einem anderen Beitrag vorgeschlagen verwendet (ich kann diesen Beitrag nicht finden) und herausgefunden, welcher Prozess eine Sperre für die Datei hat, und sie beendet. Führen Sie dann --continue oder --abort nach Bedarf aus


0

In meinem Fall habe ich es versucht, nachdem ich all diese Optionen getestet hatte und immer noch Probleme hatte, sudo git rebase --abortund es hat das Ganze getan


Seien Sie vorsichtig, wenn Sie dies mitten in einer tatsächlichen Rebase tun. Ich habe gerade meine Änderungen verloren: '(
Freeman L

Es wurde als "korrupt" angesehen, dann fangen Sie mit der Rebase von vorne an
Dani.Rangelov

0

Ich habe alles andere als einen Neustart versucht. Was bei mir funktioniert hat, ist rm -fr .git/REBASE_HEAD


0

Wenn Sie unter den Status gelangen und Rebase nicht mehr funktioniert,

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

Dann zuerst laufen,

$ git rebase -quit

Und dann den vorherigen Status aus dem Reflog wiederherstellen,

$ 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

Verwenden von,

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

-3

Ich benutze Git in Eclipse und hatte das gleiche Problem.

Schließlich stellte ich fest, dass der Menüeintrag "Rebase ..." vorübergehend in ein Untermenü umgewandelt wurde.

Team-> Rebase -> Abbruch

Es hat bei mir funktioniert.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.