Git rebase --continue beschwert sich auch dann, wenn alle Zusammenführungskonflikte gelöst wurden

114

Ich stehe vor einem Problem, dessen Lösung ich nicht sicher bin.

Ich habe eine Rebase gegen den Meister aus meiner Branche gemacht:

git rebase master

und bekam den folgenden Fehler

 First, rewinding head to replay your work on top of it...
 Applying: checkstyled.
 Using index info to reconstruct a base tree...
 Falling back to patching base and 3-way merge...
 Auto-merging AssetsLoader.java
 CONFLICT (content): Merge conflict in AssetsLoader.java
 Failed to merge in the changes.
 Patch failed at 0001 checkstyled.

Also ging ich zu meinem Lieblingseditor, behebte den 1-Zeilen-Konflikt, speicherte die Datei und machte einen Git-Status und bekam die folgende Ausgabe:

 # Not currently on any branch.
 # Changes to be committed:
 #   (use "git reset HEAD <file>..." to unstage)
 #
 #  modified:   PassengerContactHandler.java
 #
 # Unmerged paths:
 #   (use "git reset HEAD <file>..." to unstage)
 #   (use "git add/rm <file>..." as appropriate to mark resolution)
 #
 #  both modified:      AssetsLoader.java
 #

Ich habe ein Git hinzugefügt, AssetsLoader.java und einen Git-Status hinzugefügt und Folgendes erhalten:

 # Not currently on any branch.
 # Changes to be committed:
 #   (use "git reset HEAD <file>..." to unstage)
 #
 #  modified:   AssetsLoader.java
 #  modified:   PassengerContactHandler.java
 #

und als ich git rebase gemacht habe - weiter bekomme ich:

git rebase --continue
You must edit all merge conflicts and then
mark them as resolved using git add

Ich weiß, dass ich den Patch überspringen und die Rebase fortsetzen kann, bin mir jedoch nicht sicher, ob die Änderungen in PassengerContactHandler.java in meinem Zweig neu basiert werden oder nicht.

Ich bin mir also nicht sicher, wie ich vorgehen soll.

Bearbeiten: Könnte es sein, dass die Datei mit dem gelösten Konflikt genau der Originalversion entspricht?

Vielen Dank, Lucas

Edit, es ist mir gerade wieder passiert:

Es ist mir einfach wieder passiert,

(307ac0d...)|REBASE)$ git status
# Not currently on any branch.
# Changes to be committed:
#   (use "git reset HEAD <file>..." to unstage)
#
#   modified:   assets/world/level1/Level-1.xml
#   modified:   George.java
#   modified:   DefaultPassenger.java
#
# Untracked files:
#   (use "git add <file>..." to include in what will be committed)
#
#   mb-art/originalAssets/27dec/

((307ac0d ...) | REBASE) $ git rebase - weiter

You must edit all merge conflicts and then
mark them as resolved using git add

Git - Version

git version 1.7.1
Lucas
quelle
Das ist die volle Leistung von git status, oder? Kein fehlender Abschnitt darunter?
Cascabel
git-rebasesollte niemals melden, dass es ungelöste Konflikte gibt, wenn es keine gibt. Wenn Sie es schaffen, das Problem in einem einfacheren Testfall zu reproduzieren, ist das Debuggen viel einfacher. Wenn Sie jedoch git statuskeine Konflikte melden, wenn dies der git rebase --continueFall ist und Ihre Version von Git aktuell ist, können Sie versuchen, dem Git-Entwickler eine E-Mail zu senden Mailingliste unter [email protected] mit so vielen Diagnoseinformationen wie möglich.
Cascabel
1
Es ist mir gerade wieder passiert, (307ac0d ...) | REBASE) $ git status # Derzeit in keinem Zweig. # Zu übernehmende Änderungen: # (Verwenden Sie "git reset HEAD <file> ...", um die Bühne zu entfernen) # # geändert: Assets / world / level1 / Level-1.xml # geändert: George.java # geändert: DefaultPassenger.java # # Nicht verfolgte Dateien: # (Verwenden Sie "git add <file> ...", um in das festzuschreiben, was festgeschrieben wird) # # mb-art / originalAssets / 27dec /
Lucas
Ich denke, Sie sollten GITKRAKEN verwenden, es wird Ihnen bei der Lösung Ihrer Konflikte helfen
Nikhil Bhardwaj

Antworten:

115

Dies liegt daran, dass Sie beim Beheben eines Konflikts den gesamten Code im Patch entfernt haben, der auf den Zweig angewendet wurde, auf dem Sie die Basis neu erstellen. Verwenden Sie, git rebase --skipum fortzufahren.

Ein bisschen mehr Details:

Wenn Sie einen Konflikt während des erneuten Basierens beheben, bearbeiten Sie normalerweise die widersprüchliche Datei, wobei ein Teil oder der gesamte Code des Patches beibehalten wird, der derzeit auf den Zweig angewendet wird, auf dem Sie neu basieren. Nachdem Sie den Patch repariert und ausgeführt haben

git add your/conflicted/file
git status

Sie erhalten eine (normalerweise grüne) Linie mit der geänderten Datei

geändert: Ihre / konfliktierte / Datei

git rebase --continue funktioniert in dieser Situation einwandfrei.

Manchmal entfernen Sie jedoch bei der Lösung des Konflikts alles in Ihrem neuen Patch und behalten nur Code aus dem Zweig bei, auf dem Sie neu basiert haben. Wenn Sie nun die Datei hinzufügen, entspricht sie genau der Datei, auf der Sie versucht haben, eine neue Basis zu erstellen. Der Git-Status zeigt keine grüne Linie an, in der die geänderten Dateien angezeigt werden. Nun, wenn Sie das tun

git rebase --continue

git wird sich beschweren mit

Keine Änderungen - haben Sie vergessen, 'git add' zu verwenden?

Was Git in dieser Situation eigentlich von dir verlangt, ist zu benutzen

git rebase --skip

um den Patch zu überspringen. Früher habe ich das nie gemacht, da ich immer unsicher war, was tatsächlich übersprungen werden würde, wenn ich es tun würde, war mir nicht klar, was "diesen Patch überspringen" wirklich bedeutete. Aber wenn Sie keine grüne Linie mit bekommen

geändert: Ihre / konfliktierte / Datei

Nachdem Sie die in Konflikt stehende Datei bearbeitet, hinzugefügt und den Git-Status ausgeführt haben, können Sie ziemlich sicher sein, dass Sie den gesamten Patch entfernt haben, und Sie können ihn stattdessen verwenden

git rebase --skip

weitermachen.

Der ursprüngliche Beitrag sagte, dass dies manchmal funktioniert:

git add -A
git rebase --continue
# works magically?

... aber verlassen Sie sich nicht darauf (und fügen Sie keine verbleibenden Dateien in Ihre Repository-Ordner ein)

jonasfh
quelle
1
Ich schien das gleiche Problem und die gleiche Lösung zu haben, schien auch magisch!
bspink
Ich hatte das gleiche Problem. Wenn Sie den neu basierten Zweig überarbeitet und neue Dateien hinzugefügt haben und dann beim Zusammenführen der Auflösung Änderungen an diesen neuen Dateien vorgenommen haben, müssen Sie diese explizit erneut hinzufügen.
Ibrahim
Tun Sie dies nur, wenn Sie alle Junk-Dateien in Ihrem Repo verfolgen möchten.
Jed Lynch
git add ...Das Tippen wird sehr ärgerlich, nachdem ein Haufen von Dateien mit langen Pfaden geändert wurde. Gibt es eine, die git add --all-the-files-i-changedich vorher laufen kann git rebase continue?
jozxyqk
3
Um vorsichtig zu sein, wenn Sie den Befehl git rebase --skip verwenden, können Sie Ihre Arbeit verlieren (bearbeitete Dateien)
Youness Marhrani
8

Ich habe diese Warnung erhalten, als ich nicht bereitgestellte Dateien hatte. Stellen Sie sicher, dass Sie keine nicht bereitgestellten Dateien haben. Wenn Sie nicht möchten, dass sich die nicht bereitgestellten Dateien ändern, verwerfen Sie die Änderungen mit

git rm <filename>  
ScottyBlades
quelle
1
So einfach könnte es ein Kommentar sein; so hilfreich sollte es eine Antwort sein. Vielen Dank!
Lucas Lima
4

Versuchen Sie dies in Ihrer Befehlszeile auszuführen:

$ git mergetool

Sollte einen interaktiven Editor aufrufen, mit dem Sie die Konflikte lösen können. Einfacher als der Versuch, es manuell zu tun, und auch Git erkennt, wann Sie die Zusammenführung durchführen. Vermeidet auch Situationen, in denen Sie nicht versehentlich vollständig zusammenführen, was passieren kann, wenn Sie versuchen, dies manuell zu tun.

Batkins
quelle
Ich dachte nur, es könnte einfacher sein und es Ihnen auch ermöglichen, solche Situationen in Zukunft zu vermeiden.
Batkins
1
Du hast meinen Abend gerettet. Es ist zwar ein einfaches Tool, aber ohne dieses Tool könnte ich nie herausfinden, wie ich meine Konflikte lösen kann.
Eonil
4

Stellen Sie nach dem Beheben des Konflikts sicher, dass die geänderten Dateien zu Ihren bereitgestellten Dateien hinzugefügt wurden. Dies löste das Problem für mich.

Primulaveris
quelle
Das hat den Trick für mich getan. Ich überprüfte Sourcetree, nachdem ich die im OP beschriebene Nachricht erhalten hatte, und sah die beiden dort im Befehlsfenster genannten Dateien sofort als nicht bereitgestellt an. Inszenierte die Dateien, lief "git rebase --continue" und ich war wieder auf dem richtigen Weg.
Mass Dot Net
3

Sie haben einen Zusammenführungskonflikt in AssetsLoader.java verpasst. Öffnen Sie es und suchen Sie nach Konfliktmarkierungen (">>>>", "====", "<<<<<") und fügen Sie dann git erneut hinzu. Machen Sie eine "Git Diff - Inszenierung", wenn Sie Schwierigkeiten haben, sie zu finden.

Äther
quelle
3
Ich habe alle nachverfolgten Dateien überprüft und es gab keine Konfliktmarkierungen.
Lucas
Enthüllt git diff --stagedetwas Nützliches? Dies gibt an, welche Änderungen Sie zu diesem Zeitpunkt in der Rebase festschreiben möchten, um die Zusammenführungskonflikte zu lösen. In einer der Dateien sollte ein "Ups, das wollte ich nicht tun, um dieses Problem zu beheben" -Bit stehen.
Ether
4
Git sucht nicht nach Zusammenführungskonfliktmarkierungen, wenn Sie versuchen, fortzufahren. Es wird nur überprüft, ob sich der Index in einem sauberen Zustand befindet. Wenn Sie eine Datei bereitgestellt haben, die noch Konfliktmarkierungen enthält, geben Sie an, dass Sie sie mit diesen festschreiben möchten. Es ist wahrscheinlich immer ein Fehler, aber Sie können es tun.
Cascabel
@ Sonst ist das überhaupt nicht der Grund. Sie können git addeine Datei auch mit Konfliktmarkierungen erstellen. Schließlich können solche Dateien vollkommen legal sein!
fge
@Jefromi: a ha, gut zu wissen! Ich ging immer davon aus, dass die Markierungen überprüft wurden und man sie überwinden musste, wenn es beabsichtigt war.
Ether
3

Ich hatte gerade dieses Problem, und obwohl ich denke, dass es einige Ursachen geben könnte, ist hier meine ...

Ich hatte einen Git-Pre-Commit-Hook, der Commits unter bestimmten Bedingungen ablehnte. Dies ist in Ordnung, wenn Sie manuell festschreiben, da die Ausgabe des Hooks angezeigt wird und ich sie entweder korrigieren oder mit commit --no-verify ignorieren kann.

Das Problem scheint zu sein, dass beim erneuten Basieren von rebase --continue auch der Hook aufgerufen wird (um die letzten Änderungen vorzunehmen). Bei der Rebase wird die Hook-Ausgabe jedoch nicht angezeigt. Es wird lediglich angezeigt, dass sie fehlgeschlagen ist. Anschließend wird ein weniger spezifischer Fehler ausgegeben: "Sie müssen alle Zusammenführungskonflikte bearbeiten und sie dann mit git add als gelöst markieren."

Um dies zu beheben, führen Sie alle Ihre Änderungen durch und versuchen Sie statt "git rebase --continue" ein "git commit". Wenn Sie unter dem gleichen Hakenproblem leiden, sollten Sie die Gründe sehen, warum es fehlschlägt.

Interessanterweise akzeptiert Git Rebase zwar nicht die Ausgabe von Git Hook, akzeptiert jedoch eine --no-verify, um die Hooks zu umgehen.

carpii
quelle
1
Ich hatte ein ähnliches Problem. Nichts anderes hier hat für mich funktioniert, aber nur 'git commit' zu machen und dann abzubrechen, schien die Diskrepanz auf magische Weise zu lösen, und dann konnte ich 'git rebase --continue' erfolgreich durchführen.
Patrickvacek
Nur zur Veranschaulichung, da ich in letzter Zeit mit ähnlichen Problemen zu kämpfen hatte, git rebaseakzeptiert ich die --no-verifyOption. Es wird jedoch nur der pre-rebaseHook weggelassen, diese Option wird jedoch bei den nachfolgenden Aufrufen von nicht angewendet git commit.
pkrysiak
Enthält einen gültigen Punkt (Änderungen festschreiben), aber zu ausführlich für eine gute Antwort.
Jack Miller
1

Ich bin gerade über das Thema gestolpert. Ich würde git rebase --skip da nicht git statusdeutlich gestaffelte Modifikationen zeigen, die ich behalten wollte. Obwohl ich einige zusätzliche Dateien hatte, die unerwartet kamen. Ich beschloss mit

git checkout .

nicht getaggte Änderungen zu entfernen, war dann git rebase --continueerfolgreich.

Ghislain
quelle
1

Sobald Sie Ihre Änderungen korrigiert haben, vergessen Sie möglicherweise, 'git add -A' auszuführen.

git add -A
git rebase --continue
gsalgadotoledo
quelle