Wenn es um eine Reihe von Übertragungen geht, ist das Herauspicken von Rosinen ist war nicht praktisch.
Als unten erwähnt por Keith Kim Mit Git 1.7.2+ wurde die Möglichkeit eingeführt, eine Reihe von Übertragungen auszuwählen (aber Sie müssen immer noch auf die Konsequenz der Rosinenpickerei für künftige Fusionen )
git cherry-pick" hat gelernt, einen Bereich von Übertragungen auszuwählen
(z.B. " cherry-pick A..B
" und " cherry-pick --stdin
"), so auch " git revert
"; diese unterstützen nicht die schönere Sequenzierungssteuerung " rebase [-i]
" hat jedoch.
damian Kommentare und warnt uns:
In der " cherry-pick A..B
Formular", A
sollte älter sein als B
.
Wenn sie in der falschen Reihenfolge sind, schlägt der Befehl fehl. .
Wenn Sie sich für die Bereich B
über D
(einschließlich B
) das wäre B^..D
(anstelle von B..D
).
Siehe " Git erstellt einen Zweig aus einer Reihe von vorherigen Übertragungen? " zur Veranschaulichung.
Als Jubiläen Erwähnt in den Kommentaren :
Dies setzt voraus, dass B
ist keine Root-Übertragung; Sie erhalten eine " unknown revision
" Fehler sonst.
Hinweis: Seit Git 2.9.x/2.10 (Q3 2016) können Sie einen Bereich von Commits direkt in einem verwaisten Zweig (leerer Kopf) auswählen: siehe " Wie man einen bestehenden Zweig in Git verwaisen lässt ".
Ursprüngliche Antwort (Januar 2010)
A rebase --onto
wäre besser, bei dem Sie den angegebenen Bereich von Commits auf Ihrem Integrationszweig wiedergeben, als Charles Bailey beschreibt hier .
(suchen Sie auch nach "So verpflanzen Sie einen Themenzweig, der auf einem Zweig basiert, in einen anderen" in der git rebase man-Seite um ein praktisches Beispiel zu sehen git rebase --onto
)
Wenn Ihr derzeitiger Zweig die Integration ist:
# Checkout a new temporary branch at the current location
git checkout -b tmp
# Move the integration branch to the head of the new patchset
git branch -f integration last_SHA-1_of_working_branch_range
# Rebase the patchset onto tmp, the old location of integration
git rebase --onto tmp first_SHA-1_of_working_branch_range~1 integration
Damit wird alles dazwischen wiedergegeben:
- nach dem Elternteil von
first_SHA-1_of_working_branch_range
(daher die ~1
): die erste Übertragung, die Sie wiederholen möchten
- bis zu "
integration
"(der auf den letzten Commit verweist, den Sie wiedergeben wollen, aus der working
Zweig)
zu " tmp
" (der darauf hinweist, wo integration
vorher gezeigt hat)
Wenn es bei der Wiederholung einer dieser Übertragungen zu einem Konflikt kommt:
- entweder lösen Sie es und führen "
git rebase --continue
".
- oder überspringen Sie diesen Patch, und führen Sie stattdessen "
git rebase --skip
"
- oder die ganze Sache mit einem "
git rebase --abort
" (und legen Sie die integration
Zweig auf der tmp
Zweig)
Danach rebase --onto
, integration
wird bei der letzten Übergabe des Integrationszweigs zurück sein (d.h. " tmp
"Zweig + alle wiedergegebenen Übertragungen)
Mit Rosinenpickerei oder rebase --onto
nicht vergessen, dass dies Auswirkungen auf nachfolgende Zusammenführungen hat, da hier beschrieben .
Ein reines " cherry-pick
" Lösung ist hier diskutiert und würde in etwa so aussehen:
Wenn Sie einen Patch-Ansatz verwenden möchten, sind "git format-patch|git am" und "git cherry" Ihre Optionen.
Derzeit, git cherry-pick
akzeptiert nur eine einzige Übergabe, aber wenn Sie den Bereich wählen wollen B
über D
das wäre B^..D
im Git-Jargon, also
git rev-list --reverse --topo-order B^..D | while read rev
do
git cherry-pick $rev || break
done
Aber wie auch immer, wenn Sie eine Reihe von Übertragungen "wiederholen" müssen, sollte das Wort "wiederholen" Sie dazu bringen, die " rebase
"Funktion von Git.
1 Stimmen
draconianoverlord.com/2013/09/07/keine-kirschen-pflücken.html (nicht mein Blog)
5 Stimmen
Der TLDR; ist:
git cherry-pick <one-sha-before-the-oldest-sha-to-pick>..<sha-of-latest-to-pick>