Ich habe einige Änderungen in meiner Hauptniederlassung vorgenommen und möchte diese in den Upstream bringen. Wenn ich die folgenden Commits auswähle, stecke ich jedoch auf fd9f578 fest, wo git sagt:
$ git cherry-pick fd9f578
fatal: Commit fd9f57850f6b94b7906e5bbe51a0d75bf638c74d is a merge but no -m option was given.
Was will git mir sagen und ist Cherry-Pick das Richtige, um es hier zu verwenden? Der Hauptzweig enthält Änderungen an Dateien, die im Upstream-Zweig geändert wurden. Ich bin mir also sicher, dass es einige Zusammenführungskonflikte geben wird, aber diese sind nicht schlecht, um sie zu korrigieren. Ich weiß, welche Änderungen wo benötigt werden.
Dies sind die Commits, die ich in den Upstream bringen möchte.
e7d4cff added some comments...
23e6d2a moved static strings...
44cc65a incorporated test ...
40b83d5 whoops delete whitspace...
24f8a50 implemented global.c...
43651c3 cleaned up ...
068b2fe cleaned up version.c ...
fd9f578 Merge branch 'master' of ssh://extgit/git/sessions_common
4172caa cleaned up comments in sessions.c ...
quelle
git rebase
- es ist wie eine Zusammenführung, aber anstatt zwei Zweige zu integrieren, wird einer transplantiert, um auf dem anderen zu sitzen.git show
und dergleichen angezeigt ).git reset --hard HEAD@{1}
, um dein fehlendes Commit zurückzubekommen.git reset
ist nicht darauf beschränkt, sich in der Geschichte "rückwärts" zu bewegen.git checkout -b mybranch HEAD@{1}
würde auch funktionieren.git merge
Kann unbeabsichtigte Folgen haben. Dieser Befehl fügt alle anderen (älteren) Commits hinzu, die im übergeordneten Zweig vorhanden sind. Normalerweise entscheiden sich die Leute für die Auswahl von Kirschen, weil sie die anderen Commits nicht wollen. Stellen Sie sicher, dass Sie nur überprüfen, ob Sie nur die gewünschten Änderungen implementieren!-m
bedeutet die übergeordnete Nummer.Aus dem Git-Dokument:
Wenn Ihr Commit-Baum beispielsweise wie folgt lautet:
Dann
git cherry-pick E
wird das Problem angezeigt, mit dem Sie konfrontiert sind.git cherry-pick E -m 1
bedeutet verwendenD-E
, währendgit cherry-pick E -m 2
bedeutet verwendenB-C-E
.quelle
Die Antwort von @ Borealid ist richtig, aber nehmen wir an, dass Sie sich nicht darum kümmern, den genauen Zusammenführungsverlauf eines Zweigs beizubehalten, sondern nur eine linearisierte Version davon auswählen möchten. Hier ist eine einfache und sichere Möglichkeit, dies zu tun:
Startzustand: Sie befinden sich in einer Filiale
X
und möchten die Commits auswählenY..Z
.git checkout -b tempZ Z
git rebase Y
git checkout -b newX X
git cherry-pick Y..tempZ
git branch -D tempZ
Dies bedeutet, dass ein Zweig erstellt wird,
tempZ
der aufZ
dem Verlauf basiert , aber von dortY
an linearisiert ist, und dieser dann auf einer Kopie vonX
aufgerufen ausgewählt wirdnewX
. (Es ist sicherer, dies in einem neuen Zweig zu tun, als zu mutierenX
.) Natürlich kann es in Schritt 4 zu Konflikten kommen, die Sie auf die übliche Weise lösen müssen (cherry-pick
funktioniertrebase
in dieser Hinsicht sehr ähnlich ). Schließlich wird der temporäretempZ
Zweig gelöscht .Wenn in Schritt 2 die Meldung "Aktuelle VerzweigungstempZ ist aktuell" angezeigt wird,
Y..Z
war diese bereits linear. Ignorieren Sie diese Meldung einfach und fahren Sie mit Schritt 3 fort.Überprüfen
newX
Sie dann, ob dies das getan hat, was Sie wollten.(Hinweis: Dies ist nicht dasselbe wie ein einfacher
git rebase X
ZweigZ
, da er in keiner Weise von der Beziehung zwischenX
und abhängt.Y
Möglicherweise gibt es Commits zwischen dem gemeinsamen Vorfahren und demY
, den Sie nicht wollten.)quelle
git rebase Y
sagtCurrent branch tempZ is up to date
Y..Z
das schon linear war. Sie können diese Nachricht also ignorieren und mit den Schritten 3 und 4 fortfahren.Vereinfachen. Wählen Sie die Commits aus. Wählen Sie die Zusammenführung nicht aus.
Hier ist eine Neufassung der akzeptierten Antwort, die die Vorteile / Risiken möglicher Ansätze idealerweise verdeutlicht:
Sie versuchen, fd9f578 auszuwählen, was eine Fusion mit zwei Eltern war.
Anstatt eine Zusammenführung auszuwählen, ist es am einfachsten, die gewünschten Commits aus jedem Zweig der Zusammenführung auszuwählen.
Da Sie bereits zusammengeführt haben, befinden sich wahrscheinlich alle gewünschten Commits in Ihrer Liste. Wählen Sie sie direkt aus, und Sie müssen sich nicht mit dem Zusammenführungs-Commit herumschlagen.
Erläuterung
Die Art und Weise, wie ein Cherry-Pick funktioniert, besteht darin, den Diff, den ein Änderungssatz darstellt (den Unterschied zwischen dem Arbeitsbaum an diesem Punkt und dem Arbeitsbaum seines übergeordneten Elements), zu nehmen und den Änderungssatz auf Ihren aktuellen Zweig anzuwenden.
Wenn ein Commit zwei oder mehr Eltern hat, wie dies bei einer Zusammenführung der Fall ist, repräsentiert dieses Commit auch zwei oder mehr Unterschiede. Der Fehler tritt aufgrund der Unsicherheit auf, für die diff gelten soll.
Alternativen
Wenn Sie feststellen, dass Sie die Zusammenführung und die Auswahl der zugehörigen Commits einbeziehen müssen, haben Sie zwei Möglichkeiten:
(Komplizierter und undurchsichtiger; verwirft auch den Verlauf) Sie können angeben, welcher Elternteil sich bewerben soll.
Verwenden Sie dazu die
-m
Option. Zum Beispielgit cherry-pick -m 1 fd9f578
wird die erste Mutter in der Zusammenführung als Basis aufgeführt ist .Beachten Sie auch, dass beim Auswählen eines Zusammenführungs-Commits alle Änderungen, die an dem übergeordneten Commit vorgenommen wurden, das Sie nicht angegeben haben,
-m
in diesem einen Commit zusammengefasst werden . Sie verlieren all ihre Geschichte und bringen all ihre Unterschiede zusammen. Ihr Anruf.(Einfacher und vertrauter; bewahrt die Geschichte) können Sie
git merge
anstelle von verwendengit cherry-pick
.git merge
wird versucht, alle Commits anzuwenden, die in dem Zweig vorhanden sind, den Sie zusammenführen, und sie einzeln in Ihrem Git-Protokoll aufzulisten.quelle
Vereinfachung der @aira Hopwood-Methode für die Auswahl eines einzelnen Commits. Benötigen Sie keine temporären Zweige.
Im Falle des Autors:
dann mach:
quelle