git cherry-pick sagt "... 38c74d ist eine Zusammenführung, aber keine -m Option wurde gegeben"
Machte ich einige änderungen in meinen master-branch und möchten, bringen Sie diese upstream. wenn ich cherry-pick der folgenden begeht, aber ich stecken auf fd9f578 wo git sagt:
$ git cherry-pick fd9f578
fatal: Commit fd9f57850f6b94b7906e5bbe51a0d75bf638c74d is a merge but no -m option was given.
Was ist git zu versuchen, mir zu sagen, und das ist cherry-pick die richtige zu sein, hier verwenden? Der master-branch beinhaltet änderungen an Dateien, die geändert wurden, in den upstream-branch, also ich bin sicher, es wird einige merge-Konflikte, aber die sind nicht zu schlecht zu begradigen. Ich weiß, welche Veränderungen notwendig sind, wo.
Diese sind die commits, die ich möchte zu bringen upstream.
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 ...
InformationsquelleAutor der Frage wufoo | 2012-02-10
Du musst angemeldet sein, um einen Kommentar abzugeben.
Übrigens eine cherry-pick funktioniert, ist, indem Sie die diff-ein änderungssatz darstellt (die Differenz zwischen Arbeits-Baum an diesem Punkt und der Baum von seinen Eltern), und die Anwendung, um Ihre aktuellen Zweig.
So, wenn ein commit hat zwei oder mehr Eltern, es stellt auch zwei oder mehrere diffs - welche sollten angewendet werden?
Versuchen Sie zu cherry pick
fd9f578
das war ein merge mit zwei Eltern. Sie müssen also sagen, der cherry-pick Befehl, gegen die die diff berechnet werden soll, mithilfe der-m
option. Zum Beispielgit cherry-pick -m 1 fd9f578
zu verwenden Elternteil 1 als Basis.Kann ich nicht sagen, für sicher, dass für Ihre spezielle situation, aber mit
git merge
stattgit cherry-pick
ist generell ratsam. Wenn Sie cherry-pick einen merge-commit, bricht es zusammen alle die änderungen in der übergeordneten, die Sie nicht angegeben haben, zu-m
in die einen commit. Sie verlieren alle Ihre Geschichte, und glom zusammen alle Ihre diffs. Ihren Anruf.InformationsquelleAutor der Antwort Borealid
@Borealid s Antwort ist korrekt, aber angenommen, Sie kümmern sich nicht um die Erhaltung der genauen Zusammenführung Geschichte einer Filiale und wollen einfach nur cherry-pick eine linearisierte version davon. Hier ist eine einfache und sichere Art und Weise zu tun,:
Ausgangszustand: Sie sind auf Zweig
X
und Sie möchten, cherry-pick, der begehtY..Z
.git checkout -b tempZ Z
git rebase Y
git checkout -b newX X
git cherry-pick Y..tempZ
Was dies bedeutet ist erstellen einen Zweig
tempZ
basierend aufZ
aber mit der Geschichte vonY
weiter linearisiert, und dann cherry-pick, die auf eine Kopie vonX
genanntnewX
. (Es ist sicherer, auf eine neue Filiale, anstatt zu mutierenX
.) Natürlich könnte es sein, Konflikte in Schritt 4, die Sie lösen müssen in der üblichen Weise (cherry-pick
funktioniert sehr ähnlich wierebase
in dieser Hinsicht).Wenn Schritt 2 gibt die Meldung "Current-Zweig tempZ ist up-to-date", dann
Y..Z
war schon linear, also einfach ignorieren, die Meldung und fahren Sie mit den Schritten 3 und 4.Dann abgeben
newX
und sehen, ob die wussten, was Sie wollten.(Hinweis: dies ist nicht das gleiche wie eine einfache
git rebase X
wenn auf einem astZ
werden, weil es nicht davon abhängig, dass die Beziehung zwischenX
undY
; es können commits zwischen dem gemeinsamen Vorfahren undY
dass Sie nicht wollten.)InformationsquelleAutor der Antwort Daira Hopwood
Hier ist ein umschreiben der akzeptierten Antworten, die im Idealfall verdeutlicht die Vorteile/Risiken von möglichen Ansätzen:
Versuchen Sie zu cherry pick fd9f578, das war ein merge mit zwei Eltern.
Statt cherry-picking eine merge -, die einfachste Sache ist es, Kirsche wählen Sie die commit(s) Sie wollen wirklich von jedem Zweig, in den Seriendruck.
Da Sie haben bereits fusioniert, ist es wahrscheinlich, alle gewünschten verpflichtet sind, in Ihrer Liste. Cherry-pick, die Sie direkt und Sie brauchen nicht zu Durcheinander mit der merge-commit.
Erklärung
Übrigens eine cherry-pick funktioniert, ist, indem Sie die diff -, dass eine änderungsmenge darstellt (die Differenz zwischen Arbeits-Baum an diesem Punkt und der Baum von seinen Eltern), und die Anwendung der änderungen auf den aktuellen branch.
Wenn ein commit hat zwei oder mehr Eltern, wie es der Fall mit einem merge, commit stellt auch zwei oder mehrere diffs. Der Fehler tritt aufgrund der Unsicherheit über die diff gelten sollten.
alternativen
Wenn Sie feststellen, Sie brauchen, um das Zusammenführen, vs cherry-picking der Verwandte verpflichtet, haben Sie zwei Möglichkeiten:
(Mehr kompliziert und undurchsichtig; auch verwirft Geschichte) können Sie angeben, welcher Elternteil gelten sollen.
Verwenden Sie die
-m
option, dies zu tun. Zum Beispielgit cherry-pick -m 1 fd9f578
werden die ersten Eltern aufgeführt, die in der merge-als Basis.Bedenken Sie auch, dass, wenn Sie cherry-pick einen merge-commit, bricht es zusammen alle die änderungen in der übergeordneten, die Sie nicht angegeben haben, zu
-m
in die einen commit. Sie verlieren alle Ihre Geschichte, und glom zusammen alle Ihre diffs. Ihren Anruf.(Einfacher und mehr vertraut; bewahrt Geschichte), die Sie verwenden können
git merge
stattgit cherry-pick
.git merge
ist, wird versucht, alle verpflichtet sind, die sich auf die Niederlassung die Sie Zusammenführen, und in der Liste einzeln in Ihrem git-log.InformationsquelleAutor der Antwort Kay V
Vereinfachung von @Daira Hopwood Methode gut für die Kommissionierung einen einzigen commit. Brauchen keine vorübergehende Niederlassungen.
In dem Fall der Autor:
dann tun:
InformationsquelleAutor der Antwort ephemerr