Git Rebase Merge Konflikt

92

Ich gabelte ein Github-Repo und arbeitete an meinem Github-Repo.
Ich habe Pull-Anfragen gestellt und es wurde abgeschlossen.

Danach hatte der Upstream noch einige Commits, also möchte ich jetzt wieder aufbauen, ich denke, das ist was ich tun muss.
Aber ich bekomme diese Zusammenführungskonflikte:

First, rewinding head to replay your work on top of it...
Applying: Issue 135 homepage refresh
Using index info to reconstruct a base tree...
<stdin>:17: trailing whitespace.
      %h4 
warning: 1 line adds whitespace errors.
Falling back to patching base and 3-way merge...
Auto-merging app/views/layouts/application.html.haml
CONFLICT (content): Merge conflict in app/views/layouts/application.html.haml
Auto-merging app/views/home/index.html.haml
CONFLICT (content): Merge conflict in app/views/home/index.html.haml
Auto-merging app/views/home/_group_projects.html.haml
CONFLICT (content): Merge conflict in app/views/home/_group_projects.html.haml
Failed to merge in the changes.
Patch failed at 0001 Issue 135 homepage refresh

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

Ich weiß nicht, wie ich das beheben soll, bitte helfen Sie.

Pahnin
quelle
Schauen Sie sich meine Antwort in diesem Beitrag an: stackoverflow.com/questions/48307297/…
Abhishek

Antworten:

123

Rebasing kann echte Kopfschmerzen sein. Sie müssen die Zusammenführungskonflikte lösen und die Basis neu festlegen. Sie können beispielsweise das Zusammenführungswerkzeug verwenden (das sich je nach Ihren Einstellungen unterscheidet).

git mergetool

Fügen Sie dann Ihre Änderungen hinzu und fahren Sie fort

git rebase --continue

Viel Glück

iltempo
quelle
2
Ja, Rebasing ist Kopfschmerzen. Kann ich Git Pull Upstream Master verwenden?
Pahnin
2
Ja, das kannst du versuchen. Der Unterschied besteht darin, dass Ihre Commits dann nicht über die des Upstreams gesetzt werden. Möglicherweise gibt es weniger Zusammenführungskonflikte.
Iltempo
7
@iitempo Du musst kein Commit machen. Nur ein Git-Add reicht aus, um die Rebase fortzusetzen.
enigmaticPhysicist
46

Wenn Sie während der Rebase einen Konflikt haben, haben Sie drei Möglichkeiten:

  • Sie können ausführen git rebase --abort, um die Rebase vollständig rückgängig zu machen. Git bringt Sie in den Zustand Ihres Zweigs zurück, wie er vor dem Aufruf von git rebase war.

  • Sie können ausführen git rebase --skip, um das Festschreiben vollständig zu überspringen. Dies bedeutet, dass keine der durch das problematische Commit eingeführten Änderungen berücksichtigt wird. Es ist sehr selten, dass Sie diese Option wählen würden.

  • Sie können den Konflikt wie iltempo sagte beheben. Wenn Sie fertig sind, müssen Sie anrufen git rebase --continue. Mein Mergetool ist kdiff3, aber es gibt noch viele weitere, mit denen Sie Konflikte lösen können. Sie müssen Ihr Merge-Tool nur in den Einstellungen von git festlegen, damit es aufgerufen werden kann, wenn Sie https://git-scm.com/docs/git-mergetool aufrufengit mergetool

Wenn keines der oben genannten Verfahren für Sie funktioniert, gehen Sie spazieren und versuchen Sie es erneut :)

Uga Buga
quelle
2
Ja, aber wie kann man den Konflikt beheben? Das ist die Frage.
Was
@KansaiRobot Eine Option, um die manuelle Korrektur durchzuführen: Öffnen Sie die in Konflikt stehende Datei in einem Texteditor und suchen Sie nach<<<<<
Spinup
18

Wenn Sie eine Menge Verpflichtungen haben, die Sie neu begründen müssen, und ein Teil von ihnen Konflikte verursacht, tut das wirklich weh. Aber ich kann einen weniger bekannten Ansatz vorschlagen, wie man "alle Konflikte unterdrückt".

Überprüfen Sie zunächst den temporären Zweig und starten Sie die Standardzusammenführung

git checkout -b temp
git merge origin/master

Sie müssen Konflikte lösen, aber nur einmal und nur echte. Stellen Sie dann alle Dateien bereit und beenden Sie die Zusammenführung.

git commit -m "Merge branch 'origin/master' into 'temp'"

Kehren Sie dann zu Ihrem Zweig zurück (lassen Sie es Alpha sein ) und beginnen Sie mit der Neubasis, wobei Konflikte jedoch automatisch gelöst werden.

git checkout alpha
git rebase origin/master -X theirs

Der Zweig wurde neu basiert, aber das Projekt befindet sich wahrscheinlich in einem ungültigen Zustand. Das ist in Ordnung, wir haben einen letzten Schritt. Wir müssen nur den Projektstatus wiederherstellen, damit er genau wie in Zweig 'temp' ist. Technisch müssen wir nur seinen Baum (Ordnerstatus) über den Befehl git commit-tree auf niedriger Ebene kopieren . Durch das Zusammenführen in den gerade erstellten Commit wurde ein Commit erstellt.

git merge --ff $(git commit-tree temp^{tree} -m "Fix after rebase" -p HEAD)

Und temporären Zweig löschen

git branch -D temp

Das ist alles. Wir haben eine Rebase durch versteckte Zusammenführung durchgeführt.

Außerdem habe ich ein Skript geschrieben, das im Dialog erstellt werden kann. Sie finden es hier .

baur
quelle
13

Hinweis: Mit Git 2.14.x / 2.15 (Q3 2017) wird die git rebaseMeldung bei Konflikten klarer.

Siehe Commit 5fdacc1 (16. Juli 2017) von William Duclot ( williamdclt) .
(Zusammengeführt von Junio ​​C Hamano - gitster- in Commit 076eeec , 11. August 2017)

rebase: Machen Sie die Auflösungsnachricht für unerfahrene Benutzer klarer

Vor:

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

Nach:

Resolve all conflicts manually, 
mark them as resolved with git add/rm <conflicted_files>
then run "git rebase --continue".

You can instead skip this commit: run "git rebase --skip".
To abort and get back to the state before "git rebase", run "git rebase --abort".')

Die Benutzeroberfläche von Git kann verbessert werden, indem die Fehlermeldungen an diejenigen gerichtet werden, denen sie helfen: unerfahrene und gelegentliche Git-Benutzer.
Zu diesem Zweck ist es hilfreich sicherzustellen, dass die in diesen Nachrichten verwendeten Begriffe von diesem Benutzersegment verstanden werden und dass sie sie zur Lösung des Problems führen.

Insbesondere das Versagen, einen Patch während einer Git-Rebase anzuwenden, ist ein häufiges Problem, das für den unerfahrenen Benutzer sehr destabilisierend sein kann.
Es ist wichtig, sie zur Lösung des Konflikts zu führen (was ein dreistufiger und damit komplexer Prozess ist) und ihnen zu versichern, dass sie einer Situation entkommen können, mit der sie nicht umgehen können --abort.
Dieses Commit beantwortet diese beiden Punkte, indem es den Auflösungsprozess detailliert beschreibt und kryptisches Git-Linguo vermeidet.

VonC
quelle
1
Nett! Auf der Hilfeseite heißt es, den Konflikt durch Festschreiben der Änderung zu lösen, aber nein! Hier müssen wir das Commit überspringen und stattdessen einfach die Zusammenführung fortsetzen! ( Hilfeseite : help.github.com/articles/… )
Jerther