Wie cherry-pick eine Reihe von commits und merge in eine andere Abteilung?
Habe ich die folgenden repository-layout:
- master-Zweig (Produktion)
- integration
- arbeiten
Was ich erreichen will ist cherry pick eine Reihe von commits, die von dem Zweig, und führen Sie Sie in den integration branch. Ich ziemlich neu in git und ich kann nicht herausfinden, wie genau diese (die Rosinenpickerei der commit-Bereiche in einem Betrieb nicht die Verschmelzung) ohne messing repository. Irgendwelche Hinweise oder Gedanken dazu? Danke!
draconianoverlord.com/2013/09/07/no-cherry-picking.html (nicht mein blog)
InformationsquelleAutor crazybyte | 2010-01-03
Du musst angemeldet sein, um einen Kommentar abzugeben.
Wann kommt es zu einer Reihe von commits, cherry-picking
istwar nicht praktikabel.Als die unten erwähnt werden von Keith Kim, Git 1.7.2+ die Möglichkeit eingeführt, cherry-pick, eine Reihe von commits (aber Sie noch brauchen, um bewusst sein, der Folge von cherry-picking für die Zukunft Zusammenführen)
damian Kommentare und warnt uns:
Wenn Sie möchten, um die Bereich
B
durchD
(inklusive) das wäreB^..D
.Siehe "Git-create-branch aus dem Bereich der früheren verpflichtet?" als eine illustration.
Als Jubobs erwähnt in den Kommentaren:
Hinweis: als Git-2.9.x/2.10 (Q3 2016), können Sie cherry-pick eine Reihe von commit direkt auf einem verwaisten Zweig (leerer Kopf): siehe "Zu machen, wie die bestehende Niederlassung als Waise in git".
Ursprüngliche Antwort (Januar 2010)
Einen
rebase --onto
wäre besser, wo Sie die Wiedergabe der bestimmten Reihe von commit auf Ihre integration Zweig, als Charles Bailey hier beschrieben.(sehen Sie sich auch für "Hier ist, wie würden Sie-Transplantation-ein Thema-branch basierend auf einem Zweig zu einem anderen" in die git rebase Mann Seite, um zu sehen, ein Beispiel aus der Praxis
git rebase --onto
)Wenn Ihr Aktueller Zweig integration:
Wird replay alles, was zwischen:
first_SHA-1_of_working_branch_range
(daher der~1
): der erste commit, die Sie wiedergeben möchtenintegration
" (die Punkte der letzten übertragung, die Sie wiedergeben möchten, aus derworking
branch)"
tmp
" (die Punkte, wointegration
zeigte vor)Wenn es einen Konflikt, wenn einer von denen verpflichtet wird wiedergegeben:
git rebase --continue
".git rebase --skip
"git rebase --abort
" (und wieder dieintegration
Filiale auf dertmp
branch)Danach
rebase --onto
,integration
sich wieder auf das Letzte commit von der integration Zweig ("tmp
"Branche + alle wiedergegeben verpflichtet)Mit cherry-picking oder
rebase --onto
, vergessen Sie es nicht, hat das Auswirkungen auf die spätere Zusammenführungen, als hier beschrieben.Einer reinen "
cherry-pick
" Lösung ist diskutiert hier, und würde so etwas wie:Aber trotzdem, wenn Sie brauchen, um "replay" - eine Reihe von commits, das Wort "replay" zu drücken Sie die "
rebase
" - feature von Git.-m
option, wie gehen Sie mit diesen verpflichtet? Oder gibt es eine Möglichkeit heraus zu filtern, diese begeht?handhaben soll, Sie für Sie, indem Sie die Hauptschnur wird durch den
-m
parameter, den Sie gewählt haben, für dieses cherry-picking.Die Sache ist die, wenn Sie cherry-picking eine Reihe von commits, wird er Kirsche Holen die Eltern-commits richtig aber wenn dann trifft es einem normalen commit, schlägt es fehl und sagt commit ist kein merge. Ich denke, meine Frage ist besser formuliert, wie man es übergeben, die
-m
option nur, wenn es trifft einen übergeordneten commit, wenn cherry-picking Reihe von commits? Gerade jetzt, wenn ich den pass-m
wiegit cherry-pick a87afaaf..asfa789 -m 1
es gilt für alle übertragungen innerhalb der Reihe.Seltsam, ich habe nicht das Problem reproduzieren. Was ist git-version und whayt ist die genaue Fehlermeldung, die Sie sehen?
Ah, ich bin mit der git-version 2.6.4 (Apple Git-63). Die Fehler, die ich sehe, wäre so etwas wie
error: Commit 8fcaf3b61823c14674c841ea88c6067dfda3af48 is a merge but no -m option was given.
ich überhaupt realisiert hatte, konnte man nurgit cherry-pick --continue
und es wäre gut (aber es wäre nicht das parent-commit)InformationsquelleAutor VonC
Als git v1.7.2 Kirschen pflücken kann, akzeptieren eine Reihe von commits:
cherry-pick A..B
erhalten nicht verpflichten, Einen (Sie müsstenA~1..B
) und wenn es irgendwelche Konflikte git wird nicht automatisch Fort, wie rebase macht (zumindest von 1.7.3.1)Es ist auch gut zu beachten, dass
git cherry-pick A..B C
nicht funktioniert wie Sie es erwarten, ist naiv. Es wird nicht alles auswählen, im BereichA..B
und verpflichtenC
! Um dies zu tun, müssen Sie in zwei Zeilen aufgeteilt, erstegit cherry-pick A..B
und danngit cherry-pick C
. Also, wenn Sie eine Reichweite, die Sie ausführen müssen es separat.InformationsquelleAutor Keith Kim
Sind Sie sicher, dass Sie nicht wollen, um tatsächlich verschmelzen die äste? Wenn der Zweig hat einige der jüngsten verpflichtet Sie nicht möchten, können Sie einfach erstellen Sie einen neuen Zweig mit einem KOPF an der Stelle, die Sie wollen.
Nun, wenn Sie wirklich wollen, cherry-pick, eine Reihe von commits, die, aus welchem Grund auch immer, ein eleganter Weg, dies zu tun ist, ziehen Sie einfach ein patchset und anwenden, um Ihre neue integration Branche:
Dies ist im wesentlichen, was git-rebase macht sowieso, aber ohne die Notwendigkeit, Spiele zu spielen. Sie können hinzufügen
--3way
zugit-am
wenn Sie Zusammenführen müssen. Stellen Sie sicher, es gibt keine anderen *.patch-Dateien bereits in dem Verzeichnis, in dem Sie dies tun, wenn Sie Folgen Sie den Anweisungen wörtlich...InformationsquelleAutor djs
Angenommen, Sie haben 2 Filialen,
"branchA" : enthält begeht, die Sie kopieren möchten (von "commitA" zu "commitB"
"branchB" : die Branche, die Sie möchten, dass der commit übertragen werden, von "branchA"
1)
2) Holen Sie sich die IDs des "commitA" und "commitB"
3)
4)
5) für den Fall, Sie haben einen Konflikt, lösen Sie es und geben Sie
weiterhin die cherry-pick-Prozess.
InformationsquelleAutor KostasA
Wickelte ich VonC code in einem kurzen bash-Skript,
git-multi-cherry-pick
für einfach läuft:Ich bin derzeit mit, wie ich den Wiederaufbau der Geschichte des Projekts, hatte die beiden 3rd-party-code-Anpassungen und vermischt in der gleichen svn-trunk. Ich bin jetzt splitting auseinander core 3rd-party-code, 3rd-party-Module und Anpassungen auf Ihre eigenen git-Verzweigungen zum besseren Verständnis der Anpassungen für die Zukunft.
git-cherry-pick
ist hilfreich in dieser situation, da ich zwei Bäume in der gleichen Ablage, aber ohne einen gemeinsamen Vorfahren.InformationsquelleAutor Adam Franco
Alle der oben genannten Optionen werden Sie aufgefordert, zum auflösen von Konflikten beim Zusammenführen. Wenn Sie zum Zusammenführen von änderungen verpflichtet, die für ein team, es ist schwer zu bekommen gelöst werden, die von Konflikten beim Zusammenführen von Entwicklern und gehen. Jedoch, "git merge" wird die Zusammenführung in einem Schuss, aber Sie können nicht passieren Sie eine Reihe von Revisionen als argument. wir haben die Verwendung von "git diff" und "git apply" - Befehle für den Seriendruck Bereich von Drehzahlen. Ich habe beobachtet, dass "git apply" wird scheitern, wenn die patch-Datei hat das diff für viel zu viele Datei, so haben wir um einen patch zu erstellen, die pro Datei und dann anwenden. Beachten Sie, dass das Skript nicht in der Lage, die Dateien zu löschen, die gelöscht werden, im source-Zweig. Dies ist ein seltener Fall, können Sie manuell löschen Dateien aus dem target-Zweig. Der exit-status von "git apply" ist nicht null, wenn es nicht in der Lage, um den patch anwenden, sollten Sie jedoch verwenden -3way-option wird wieder 3-Wege-merge und Sie nicht haben, um Angst zu Versagen.
Unten ist das script.
InformationsquelleAutor Yoganand Bijapur
Weitere option könnte sein, die merge mit Strategie, die uns zu dem verpflichten, bevor die Reihe und dann einen 'normalen' verschmelzen mit dem letzten commit des Bereichs (oder-Zweig, wenn es der Letzte ist). So nehme nur 2345 und 3456 commit des master zusammengeführt Zweig:
in der feature-branch:
InformationsquelleAutor Koos Vriezen