it-swarm.com.de

git: verzweigte Zweige; wie soll ich vorgehen?

Mein Ortsbaum ist vom Master abgewichen:

$ git status
# On branch master
# Your branch and 'Origin/master' have diverged,
# and have 7 and 3 different commit(s) each, respectively.
#
nothing to commit (working directory clean)

Ich habe git pull --rebase ausprobiert und bin fehlgeschlagen:

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

Also bin ich mit git rebase --abort zurückgekehrt und jetzt auf Platz 1.

Was ich will ist:

  1. "Exportiere" meine 7 Patches in vom Menschen lesbare Diff-Dateien (a la hg export ).
  2. Mache aus meinem Baum eine Kopie des Origin/Masters (a la hg strip ).
  3. wenden Sie meine 7 Patches nacheinander manuell an (a la hg import ).

Ich verstehe, dass git rebase --continue dies tut . Ich habe es getan und es hat funktioniert (nach ein paar manuellen Zusammenführungen und einem git add ) . Allerdings möchte ich Man kann das manuell tun, Ich frage mich also, was die Befehle git sind, die den oben genannten hg - Befehlen entsprechen.

Vielen Dank.

PS. Bitte sagen Sie mir nicht, dass die Verwendung einer ChangeLog - Datei mit git dumm ist . Auch wenn es so ist, liegt es nicht an mir.

31
sds

Es gibt natürlich verschiedene Möglichkeiten, dies manuell durchzuführen. Du hast immer noch die gleichen Konflikte, weil git das für dich unter der Haube macht. Wenn Sie dies jedoch manuell tun möchten, haben Sie einige Möglichkeiten.

Exportieren Sie zunächst Ihre Commits als eine Reihe von Patches. Der einfachste Weg, dies zu tun, ist git format-patch:

git format-patch -M @{upstream}

es werden 7 Patch-Dateien erstellt - eine für jedes Commit. (Beachten Sie, dass "@ {upstream}" wörtlich ist - dies ist eine weniger bekannte Funktion von git.) Dies ist besser als das Erfassen der Ausgabe von git diff, da alle Commit-Informationen (Autor, Datum, Nachricht usw.) vorhanden sind konserviert.

Dann könnten Sie Ihr Repository zurücksetzen, um es dem Upstream anzupassen:

git reset --hard @{upstream}

Dann können Sie Ihre Patches mit git am erneut anwenden - entweder einzeln oder alle gleichzeitig.

git am 0001-blah-blah.patch
git am 0002-blah-blah.patch
...

Eine zweite Möglichkeit wäre, einen Ersatzzweig mit Ihrer Arbeit anzulegen:

git branch scrap

Dann setzen Sie Ihren Zweig in den Upstream zurück:

git reset --hard @{upstream}

Dann komm die Kirsche ab:

git cherry-pick scrap~6
git cherry-pick scrap~5
git cherry-pick scrap~4
...

Dann verwerfen Sie den Schrottzweig:

git branch -D scrap
45
Pat Notz

Haben Sie git merge Origin/master ausprobiert?

Ihre Remote-Änderungen werden im Zweig Origin/master gespeichert. (Oder, wenn Sie git fetch tun.) Führen Sie einfach die beiden Zweige - master und Origin/master - wie zwei Zweige zusammen und lösen Sie die Konflikte (falls vorhanden).

Dies kann Ihnen helfen, wenn Sie wissen müssen, wie Sie Konflikte mit Git lösen können.

Wie löst man Zusammenführungskonflikte in Git?

16
Sailesh

Git sagt, es habe versucht, genau das zu tun, was Sie möchten (wenden Sie Ihre Patches erneut auf die neuesten Änderungen von Origin/master an), ist aber mit einem Konflikt fehlgeschlagen. Direkt nach git pull --rebase-Konflikten öffnen Sie einen Editor mit den konfliktierten Dateien (git status listet diese unter "Beide geändert" auf) und löst die Konflikte, die in Standard-Konfliktsprachen markiert sind. Wenn Sie mit dem Lösen des Konflikts fertig sind, werfen Sie einen git rebase --continue (oder git rebase --skip, falls Ihre Lösung keine Änderungen einleitet).

Lesen Sie mehr über seine at Stackexchange-Dokumentation für 'Beheben von Zusammenführungskonflikten nach einem Git-Rebase' .

7
wilhelmtell

Hier sind einige gute Antworten auf dasselbe Problem (nur ohne Konfliktlösung):

master branch und 'Origin/master' haben sich auseinandergezogen, wie kann man 'verzweigen'?

Zunächst möchten Sie vielleicht überprüfen, was auf dem Remote-Master im Vergleich zu Ihrer lokalen Version geändert wurde:

git log HEAD..Origin/master

Um Ihr eigentliches Problem zu beheben, läuft es auf die gleiche Linie ab, die wilhelmtell vorgeschlagen hat:

git pull --rebase

Wie Sie gesagt haben, werden Sie Konflikte bekommen.

Konfliktlösungen sind ein wiederkehrendes Problem. Wenn Sie es noch nicht getan haben, können Sie unter git mergetool nachsehen (siehe git help mergetool für Details). Um grafische Unterstützung zu erhalten, würde ich empfehlen, die merge.tool-Konfiguration zu überschreiben. Wenn Sie beispielsweise meld für 3-Wege-Zusammenführungen verwenden möchten, können Sie Folgendes verwenden:

git config --global merge.tool meld

Was hat git pull --rebase getan, nachdem Sie den Konflikt gelöst haben? Es hat alle Änderungen vom Origin/Master mit Ihrem lokalen Master zusammengeführt und die Änderungen darüber wiedergegeben. Glückwunsch, Sie sind wieder normal.

0
Philipp Claßen