Git Rebase: Konflikte blockieren weiterhin den Fortschritt

120

Ich habe einen Git-Zweig (v4 genannt), der erst gestern vom Master erstellt wurde. Es gab ein paar Änderungen am Master, die ich in v4 bekommen möchte. In Version 4 habe ich versucht, eine Rebase vom Master durchzuführen, und eine Datei bringt immer wieder Probleme: eine einzeilige Textdatei, die die Versionsnummer enthält. Diese Datei app/views/common/version.txtenthält vor dem erneuten Basieren diesen Text:

v1.4-alpha-02

Folgendes mache ich:

> git rebase master
First, rewinding head to replay your work on top of it...
Applying: new version, new branch
error: patch failed: app/views/common/version.txt:1
error: app/views/common/version.txt: patch does not apply
Using index info to reconstruct a base tree...
Falling back to patching base and 3-way merge...
Auto-merging app/views/common/version.txt
CONFLICT (content): Merge conflict in app/views/common/version.txt
Failed to merge in the changes.
Patch failed at 0001 new version, new branch

When you have resolved this problem run "git rebase --continue".
If you would prefer to skip this patch, instead run "git rebase --skip".
To restore the original branch and stop rebasing run "git rebase --abort".

Das version.txtsieht jetzt so aus:

<<<<<<< HEAD:app/views/common/version.txt
v1.4-alpha-02
=======
v1.4-alpha-01
>>>>>>> new version, new branch:app/views/common/version.txt

Also, ich räume auf und es sieht jetzt so aus:

v1.4-alpha-02

und dann habe ich versucht weiterzumachen: zuerst versuche ich ein Commit:

> git commit -a -m "merged"
# Not currently on any branch.
nothing to commit (working directory clean)

Kein Glück da. Also habe ich versucht, die Datei hinzuzufügen:

git add app/views/common/version.txt

Keine Antwort. Keine Nachricht ist eine gute Nachricht, denke ich. Also versuche ich fortzufahren:

> git rebase --continue
Applying: new version, new branch
No changes - did you forget to use 'git add'?

When you have resolved this problem run "git rebase --continue".
If you would prefer to skip this patch, instead run "git rebase --skip".
To restore the original branch and stop rebasing run "git rebase --abort".

An diesem Punkt, nachdem ich mich damit beschäftigt habe, stoße ich meinen Kopf vom Schreibtisch.

Was ist denn hier los? Was mache ich falsch? Kann mich jemand klarstellen?

EDIT - für unutbu

Ich habe die Datei wie vorgeschlagen geändert und erhalte den gleichen Fehler:

> git rebase master
First, rewinding head to replay your work on top of it...
Applying: new version, new branch
error: patch failed: app/views/common/version.txt:1
error: app/views/common/version.txt: patch does not apply
Using index info to reconstruct a base tree...
Falling back to patching base and 3-way merge...
Auto-merging app/views/common/version.txt
CONFLICT (content): Merge conflict in app/views/common/version.txt
Failed to merge in the changes.
Patch failed at 0001 new version, new branch

When you have resolved this problem run "git rebase --continue".
If you would prefer to skip this patch, instead run "git rebase --skip".
To restore the original branch and stop rebasing run "git rebase --abort".
Max Williams
quelle
10
Vielen Dank für diese Frage. Ich hatte genau das gleiche Problem
Archan Mishra
6
wäre schön, wenn Sie eine Antwort bestätigen
holms
3
@MaxWilliams, ich denke du (wie ich) hast @unutbus Rat falsch interpretiert : 1) zuerst rennst du git rebase master und lässt es scheitern ; 2) dann bearbeiten Sie es version.txtund machen es so, wie es an diesem Punkt aussehen sollte, und speichern die Bearbeitung; 3) dann du git add .../version.txt; 4) dann tust du git rebase --continue( nicht 'festschreiben' )! Wenn dies rebase --continuehier erfolgreich ist, ist es bereits festgeschrieben (hier nicht erforderlich git commit!). git pushSie müssen also nur noch (wenn Sie ein Remote-Repo verwenden). Hoffe das hilft, wenn ich es richtig verstanden habe :)- Prost!
Sdaau
@ MaxWilliams, hast du jemals eine Antwort darauf bekommen: ruby-forum.com/topic/187288 (Ich werde dies sofort nach einer Antwort löschen, wenn jemand anderes nicht zuerst dort ankommt !!)
atw

Antworten:

102

Ich habe ein ähnliches Problem mit einer Rebase festgestellt. Mein Problem wurde verursacht, weil einer meiner Commits nur eine Datei geändert hat und ich beim Auflösen die in diesem Commit eingeführte Änderung verworfen habe. Ich konnte mein Problem lösen, indem ich das entsprechende Commit ( git rebase --skip) übersprang .

Sie können dieses Problem in einem Test-Repository reproduzieren. Erstellen Sie zuerst das Repository.

$ mkdir failing-merge
$ cd failing-merge
$ git init
Initialized empty Git repository in $HOME/failing-merge/.git/

Übernehmen Sie dann den ursprünglichen Inhalt von version.txtin master.

$ echo v1.4-alpha-02 > version.txt
$ git add version.txt
$ git commit -m initial
[master (root-commit) 2eef0a5] initial
 1 files changed, 1 insertions(+), 0 deletions(-)
 create mode 100644 version.txt

Erstellen Sie den v4Zweig und ändern Sie den Inhalt von version.txt.

$ git checkout -b v4
Switched to a new branch 'v4'
$ echo v1.4-alpha-03 > version.txt
$ git add version.txt
$ git commit -m v4
[v4 1ef8c9b] v4
 1 files changed, 1 insertions(+), 1 deletions(-)

Gehen Sie zurück zu masterund ändern Sie den Inhalt von, version.txtdamit es während der Rebase zu einem Konflikt kommt.

$ git checkout master
Switched to branch 'master'
$ echo v1.4-alpha-04 > version.txt
$ git add version.txt
$ git commit -m master
[master 7313eb3] master
 1 files changed, 1 insertions(+), 1 deletions(-)

v4Wechseln Sie zurück zum Zweig und versuchen Sie, die Basis neu zu erstellen. Es schlägt mit einem Konflikt version.txtwie geplant fehl .

$ git checkout v4
Switched to branch 'v4'
$ git rebase master
First, rewinding head to replay your work on top of it...
Applying: v4
Using index info to reconstruct a base tree...
Falling back to patching base and 3-way merge...
Auto-merging version.txt
CONFLICT (content): Merge conflict in version.txt
Recorded preimage for 'version.txt'
Failed to merge in the changes.
Patch failed at 0001 v4

When you have resolved this problem run "git rebase --continue".
If you would prefer to skip this patch, instead run "git rebase --skip".
To restore the original branch and stop rebasing run "git rebase --abort".
$ cat version.txt
<<<<<<< HEAD
v1.4-alpha-04
=======
v1.4-alpha-03
>>>>>>> v4

Wir lösen den Konflikt durch Auswahl des masterInhalts von version.txt. Wir fügen die Datei hinzu und versuchen, unsere Rebase fortzusetzen.

$ echo v1.4-alpha-04 > version.txt
$ git add version.txt
$ git rebase --continue 
Applying: v4
No changes - did you forget to use 'git add'?
If there is nothing left to stage, chances are that something else
already introduced the same changes; you might want to skip this patch.

When you have resolved this problem run "git rebase --continue".
If you would prefer to skip this patch, instead run "git rebase --skip".
To restore the original branch and stop rebasing run "git rebase --abort".

Es schlägt fehl ! Mal sehen, welche Änderungen gitsich in unserem Repository befinden.

$ git status
# Not currently on any branch.
nothing to commit (working directory clean)

Ah ah, es gibt keine Veränderung. Wenn Sie die vorherige Fehlermeldung ausführlich gelesen haben, haben Sie gituns darüber informiert und die Verwendung empfohlen git rebase --skip. Er sagte zu uns: "Wenn nichts mehr zu inszenieren ist, besteht die Möglichkeit, dass etwas anderes bereits dieselben Änderungen eingeführt hat. Vielleicht möchten Sie diesen Patch überspringen." Also überspringen wir einfach das Commit und die Rebase ist erfolgreich.

$ git rebase --skip
HEAD is now at 7313eb3 master

Ein Wort der Vorsicht : Bitte beachten Sie, dass git rebase --skipdas Commit, das gitversucht hat, die Basis wiederherzustellen , dadurch vollständig gelöscht wird. In unserem Fall sollte dies in Ordnung sein, da gitdie Beschwerde ein leeres Commit ist. Wenn Sie der Meinung sind, dass Sie nach Abschluss der Rebase Änderungen verloren haben, können Sie git reflogdie Commit-ID Ihres Repositorys vor der Rebase abrufen und git reset --hardIhr Depot wieder in diesen Zustand versetzen (dies ist eine weitere destruktive Operation).

Sylvain Defresne
quelle
4
Vielen Dank, dass Sie sich die Zeit genommen haben, diese lange Erklärung zu schreiben, Sylvain! Das macht es klarer. Ich glaube, ich war immer nur nervös, einen Patch zu überspringen, da ich das Gefühl hatte, dass die Arbeit verloren gehen könnte: Das heißt, der Patch umfasste alle von der Rebase betroffenen Dateien und nicht nur die mit dem Konflikt. Ist ein Patch dann nur eine einzelne Zusammenführung einer einzelnen Datei?
Max Williams
3
Nein, ein Patch enthält den Unterschied zu allen Dateien, die in einem einzigen Commit geändert wurden. Bei Verwendung git rebase --skipüberspringen Sie jedoch nur ein einziges Commit. Ich git statusgebe im Allgemeinen ein aus, bevor ich ein Commit überspringe, um zu sehen, ob ich mich in dieser Situation befinde.
Sylvain Defresne
1
Ich wollte Max nur wiederholen, indem ich mich bedankte, dass er sich die Zeit genommen hatte, eine großartige Erklärung zu schreiben - ich verstehe endlich, warum dies geschieht. Ich habe auch keine Angst mehr vor rebase --skip:).
Ben Dolman
1
Warnung - Wenn Sie mehrere Änderungen an einem Commit vorgenommen haben, verlieren Sie möglicherweise die Arbeit beim Ausführen von Git Rebase - Skip. Ich habe es gerade getan
Chrissy H
@ChrissyH Es sei denn, Sie haben eine git reflog purgeoder git reflog deleteSie können Ihre Änderungen trotzdem mit zurückbekommen git reflog. Versuchen Sie, die verschiedenen Commits zu überprüfen, auf die dort verwiesen wird. Eine davon sollte der Status Ihres Baums sein, bevor Sie das Ganze gestartet haben git rebase.
Sylvain Defresne
23

Zitat von hier: http://wholemeal.co.nz/node/9

Huh?!? Nein, ich habe nicht vergessen, git add zu verwenden, ich habe es getan ... wie ... vor 2 Sekunden!

Es stellt sich heraus, dass, weil es keine Änderung gegenüber dem Patch gibt, der Verdacht besteht, dass etwas schief gelaufen ist. Git erwartet, dass ein Patch angewendet wurde, aber die Datei ist unverändert geblieben.

Die Fehlermeldung ist nicht sehr intuitiv, enthält jedoch die Antwort. Wir müssen Rebase nur anweisen, diesen Patch zu überspringen. Es ist auch nicht erforderlich, die Konfliktmarkierungen in der Datei zu korrigieren. Sie erhalten die Dateiversion aus dem Zweig, auf dem Sie neu basieren.

$ git rebase --skip
Bijou Trouvaille
quelle
Nachdem ich git mergetool verwendet und die Änderungen korrigiert, dann hinzugefügt und festgeschrieben hatte, gab ich einfach <code> git rebase --skip </ code> ein, während 'Derzeit in keinem Zweig'. Und alles wurde repariert. Vielen Dank!
Geerlingguy
Eigentlich denke ich, dass es eine Kombination aus ständig laufendem Git-Mergetool, dann Git-Rebase - Fortsetzung, dann Git-Mergetool usw. war, die meine Situation endgültig korrigierte.
Geerlingguy
6

Diese Fehlermeldung ist ein Ergebnis Ihrer git commit -a -m "merged". Wenn Sie die Datei nur reparieren, dann ausführen git add <file>und git rebase --continue, sollte es gut funktionieren. git rebase --continueversucht, ein Commit durchzuführen, stellt jedoch fest, dass keine Änderungen an Commit ausstehen (da Sie diese bereits festgeschrieben haben).

Twalberg
quelle
1
Dies scheint zumindest im allgemeinen Fall viel vernünftiger zu sein als ein Überspringen. Ich bin überrascht, dass es nicht die beste Antwort ist.
EmeraldD.
1
@EmeraldD., Funktioniert nicht. Das Reparieren und Ausführen der Datei git add <file>löst das Problem nicht. berichtet git rebase --continue immer nochNo changes - did you forget to use 'git add'?
Pacerier
6

Ändern Sie app / views / common / version.txt in

v1.4-alpha-01

Denken Sie an dieser Stelle in der Rebase daran, dass Sie Zusammenführungskonflikte lösen, um den Fortschritt des Nicht-Master- Zweigs anzuzeigen .

Also, beim Umbasieren von

      A---B---C topic
     /
D---E---F---G master

zu

              A*--B*--C* topic
             /
D---E---F---G master

Der Konflikt, den Sie lösen, besteht darin, wie Sie A * im Themenzweig erstellen.

Also nach tun git rebase --abortsollten die Befehle sein

git checkout topic
git rebase master
< make edits to resolve conflicts >
git add .
git rebase --continue
unutbu
quelle
3
Danke unutbu, ich habe das versucht, aber kein Glück: siehe OP für neue Bearbeitung. Prost
Max Williams
4

Das Verhalten, das Sie sehen, ist nicht das, was ich von einer typischen Rebase mit nur diesem Konflikt erwarten würde. Ziehen Sie in Betracht, einen separaten Zweig zu verwenden, um diese Rebase durchzuführen (insbesondere, wenn Sie die Commits bereits per Fernzugriff übertragen haben, damit Sie schnell vorspulen). Auch git mergetoolkann hilfreich sein , Konflikte zu lösen und die Erinnerung ein auszustellen git add.

In diesem minimalen Beispiel funktioniert die Rebase wie erwartet. Können Sie ein Beispiel angeben, das das Verhalten zeigt, das Sie sehen?

#!/bin/bash

cd /tmp
mkdir rebasetest
cd rebasetest
git init
echo 'v1.0' > version.txt
git add version.txt
git commit -m 'initial commit'
git checkout -b v4
echo 'v1.4-alpha-01' > version.txt
git add version.txt
git commit -m 'created v4'
git checkout master
git merge v4
echo 'v1.4-alpha-01-rc1' > version.txt
git add version.txt
git commit -m 'upped version on master to v1.4-alpha-01-rc1'
git checkout v4
echo 'v1.4-alpha-02' > version.txt
git add version.txt
git commit -m 'starting work on alpha-02'

git rebase master
echo 'v1.4-alpha-02' > version.txt
git add version.txt
git rebase --continue
Ben Taitelbaum
quelle
4

Hier sind ein paar Ideen:

Adam Monsen
quelle