Ich habe zwei Zweige. Commit a
ist der Kopf von einem, während der andere hat b
, c
, d
, e
und f
auf der Oberseite a
. Ich mag bewegen c
, d
, e
und f
zum ersten Zweig ohne zu begehen b
. Verwendung Kirsche es holen ist einfach: Kasse ersten Zweiges kirsch Pick nacheinander c
zu f
und zweiten Zweig auf den ersten rebase. Aber ist es eine Möglichkeit, alle herauspicken c
- f
in einem Befehl?
Hier ist eine visuelle Beschreibung des Szenarios (danke JJD ):
b
darauf basieren möchtenf
, aber das hat nichts mit dem Kirschpflücken zu tun.)Antworten:
Mit Git 1.7.2 wurde die Möglichkeit eingeführt, eine Reihe von Commits auszuwählen. Aus den Versionshinweisen :
Führen Sie Folgendes aus, um alle Commits von Commit
A
zu CommitB
(woA
älter alsB
) auszuwählen :Wenn Sie A selbst ignorieren möchten, führen Sie Folgendes aus:
(Gutschrift geht an Damian, JB Rainsberger und Sschaef in den Kommentaren)
quelle
git cherry-pick A^..B
git cherry-pick f~3
danngit cherry-pick f~2
usw. bis ausführengit cherry-pick f
(durch Drücken des Aufwärtspfeils wird der vorherige Befehl abgerufen, sodass ich die Nummer schnell ändern und ausführen kann es sollte in den meisten Konsolen ähnlich sein).git cherry-pick master..somebranch
wählt alle Commits auf einem Zweig seit dem Master aus (vorausgesetzt, er basiert bereits auf dem Master) und wendet sie auf Ihre aktuelle Filiale an.Der einfachste Weg, dies zu tun, ist mit der
onto
Option zurebase
. Nehmen wir an, dass der Zweig, der aktuelle beendet ist beia
mybranch genannt wird , und dies ist der Zweig, den Sie verschieben wollenc
-f
auf.quelle
git checkout secondbranch && git rebase mybranch
für die vollständige Antwort hinzufügenrebase
den interaktiven Modus verwenden. Danke, @Charles!--interactive
einige Commits aus der Sequenz entfernen oder vor dem "Cherry Pick" neu anordnen können. +1b
in diesem Beispiel), aber ja, das hat bei mir funktioniert.Oder der gewünschte Einzeiler:
quelle
Sie können eine serielle Kombination von
git rebase
und verwendengit branch
, um eine Gruppe von Commits auf einen anderen Zweig anzuwenden. Wie bereits von wolfc gepostet, kopiert der erste Befehl die Commits. Die Änderung ist jedoch erst sichtbar, wenn Sie dem obersten Commit der Gruppe einen Zweignamen hinzufügen.Bitte öffnen Sie das Bild in einem neuen Tab ...
So fassen Sie die Befehle in Textform zusammen:
gitk --all &
.git rebase --onto a b f
.HEAD
ist markiert.git branch selection
Dies sollte die Dinge klarstellen:
a
ist das neue Stammziel der Gruppe.b
ist das Commit vor dem ersten Commit der Gruppe (exklusiv).f
ist das letzte Commit der Gruppe (einschließlich).Anschließend können Sie
git checkout feature && git reset --hard b
die Commitsc
bisf
aus demfeature
Zweig löschen .Zusätzlich zu dieser Antwort habe ich einen Blog-Beitrag geschrieben, in dem die Befehle in einem anderen Szenario beschrieben werden, um die allgemeine Verwendung zu erleichtern.
quelle
git rebase --onto a b mybranch
und übrigens - welches Programm macht diese raffinierten Git-Bilder?So wenden Sie die Kommentare von JB Rainsberger und sschaef an, um die Frage spezifisch zu beantworten ... So verwenden Sie in diesem Beispiel einen Cherry-Pick-Bereich:
oder
quelle
git 2.7.0.windows.1
und bemerkte, dass, wenn ich versuche, eine Reihe von Commits auszuwählen, alles in Ordnung ist, aber Git sagt Ihnen nirgendwo, was Sie tun müssen,git cherry-pick --continue | --abort | --quit
bevor Sie erneut versuchen, eine Commit / Cherry-Pick durchzuführen. Wenn Sie also eine Reihe von Commits auswählen, müssen Siegit cherry-pick --continue
jedes Mal, wenn Sie bereit sind (Konflikte lösen oder so), ein Commit aus dem angegebenen Bereich ausführen .^
nach dem c bedeutet tatsächlich "das Festschreiben vor c", was in diesem Fall b ist. Deshalbc^..f
ist das auch sob..f
. Versuchen Sie esgit log c^..f
und Sie sollten Commits c bis f sehen, genau so, als ob Sie es getan hättengit log b..f
Wenn Sie selektive Revisionen zum Zusammenführen haben, z. B. A, C, F, J von A, B, C, D, E, F, G, H, I, J, verwenden Sie einfach den folgenden Befehl:
quelle
quelle
git cherry-pick {hash of c}; git cherry-pick {hash of d}; ...
Um von einer Commit-ID bis zur Spitze des Zweigs zu wählen, können Sie Folgendes verwenden:
git cherry-pick commit_id^..branch_name
quelle
Eine andere erwähnenswerte Variante ist, dass
n
die~
Syntax nützlich sein kann , wenn Sie die letzten Commits von einem Zweig möchten :In diesem Fall würde der obige Befehl die letzten 4 Commits aus einem aufgerufenen Zweig auswählen
some-branch
(obwohl Sie anstelle eines Zweignamens auch einen Commit-Hash verwenden könnten).quelle
Der einfachste Weg, dies zu tun, könnte sein:
MERGE_BASE=$(git merge-base branch-a branch-b)
Setzen Sie den resultierenden Zweig neu auf sich selbst, beginnend mit der Zusammenführungsbasis ab Schritt 1, und entfernen Sie manuell nicht gewünschte Commits:
Wenn es nur wenige neue Commits gibt, überspringen Sie alternativ Schritt 1 und verwenden Sie sie einfach
Verwenden Sie im ersten Schritt genug
^
, um an der Zusammenführungsbasis vorbeizukommen.Sie werden so etwas in der interaktiven Rebase sehen:
Entfernen Sie dann die Zeilen b (und alle anderen gewünschten Zeilen).
quelle
quelle
Hier ist ein Skript, mit dem Sie mehrere Commits hintereinander auswählen können, indem Sie dem Skript einfach mitteilen, welche Quell- und Zielzweige für die Cherry-Picks und wie viele Commits vorhanden sind:
https://gist.github.com/nickboldt/99ac1dc4eb4c9ff003a1effef2eb2d81
So wählen Sie von Ihrem Zweig zum Master aus (verwendet den aktuellen Zweig als Quelle):
So wählen Sie die letzten 5 Commits aus Ihrem 6.19.x-Zweig zum Master aus:
quelle