Wenn es um eine Reihe von Commits geht, Kirschernte ist war nicht praktisch.
Wie unten von Keith Kim erwähnt , hat Git 1.7.2+ die Möglichkeit eingeführt, eine Reihe von Commits auszuwählen (aber Sie müssen sich immer noch der Konsequenzen der Auswahl von Kirschen für zukünftige Zusammenführungen bewusst sein ).
git cherry-pick "hat gelernt, eine Reihe von Commits auszuwählen
(z. B." cherry-pick A..B
"und" cherry-pick --stdin
"), ebenso" git revert
"; diese unterstützen jedoch nicht die schönere Sequenzierungssteuerung" rebase [-i]
".
damian kommentiert und warnt uns:
In der " cherry-pick A..B
" Form A
sollte älter sein alsB
.
Wenn sie in der falschen Reihenfolge sind, schlägt der Befehl stillschweigend fehl .
Wenn Sie den Bereich B
durch D
(einschließlich) auswählen möchten , wäre dies B^..D
.
Siehe " Git Zweig aus Bereich früherer Commits erstellen? " Zur Veranschaulichung.
Wie Jubobs erwähnt in den Kommentaren :
Dies setzt voraus, dass B
es sich nicht um ein Root-Commit handelt. unknown revision
Andernfalls wird ein " " Fehler angezeigt.
Hinweis: Ab Git 2.9.x / 2.10 (Q3 2016) können Sie einen Bereich von Commits direkt für einen verwaisten Zweig (leerer Kopf) auswählen: siehe " So machen Sie einen vorhandenen Zweig zu einem verwaisten Zweig in Git ".
Ursprüngliche Antwort (Januar 2010)
A rebase --onto
wäre besser, wenn Sie den angegebenen Commit-Bereich zusätzlich zu Ihrem Integrationszweig wiedergeben, wie Charles Bailey hier beschrieben hat .
( Suchen Sie auch in der git rebase-Manpage nach "So würden Sie einen Themenzweig basierend auf einem Zweig in einen anderen transplantieren" , um ein praktisches Beispiel dafür zu sehen. git rebase --onto
)
Wenn Ihre aktuelle Niederlassung 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
Das wird alles zwischen:
- nach dem übergeordneten Element von
first_SHA-1_of_working_branch_range
(daher das ~1
): das erste Commit, das Sie wiederholen möchten
- bis zu "
integration
" (was auf das letzte Commit zeigt, das Sie aus dem working
Zweig wiedergeben möchten )
zu " tmp
" (was zeigt, wohin integration
vorher gezeigt wurde)
Wenn bei der Wiedergabe eines dieser Commits ein Konflikt auftritt:
- entweder lösen und "
git rebase --continue
" ausführen .
- oder überspringen Sie diesen Patch und führen Sie stattdessen "
git rebase --skip
"
- oder stornieren Sie alles mit einem "
git rebase --abort
" (und setzen Sie den integration
Zweig wieder auf den tmp
Zweig)
Danach rebase --onto
, integration
wird in der letzten wieder commit der Integration Zweig (das „ist tmp
“ branch + alle wieder Commits)
rebase --onto
Vergessen Sie nicht, beim Kirschpflücken oder , wie hier beschrieben, Konsequenzen für spätere Zusammenführungen zu haben .
Eine reine " cherry-pick
" Lösung wird hier diskutiert und würde Folgendes beinhalten:
Wenn Sie einen Patch-Ansatz verwenden möchten, stehen Ihnen "git format-patch | git am" und "git cherry" zur Verfügung.
Derzeit git cherry-pick
akzeptiert nur ein einziges Commit, aber wenn Sie den Bereich B
durch auswählen möchten D
, wäre dies B^..D
in Git-Jargon, also
git rev-list --reverse --topo-order B^..D | while read rev
do
git cherry-pick $rev || break
done
Wenn Sie jedoch eine Reihe von Commits "wiedergeben" müssen, sollte das Wort "Wiedergabe" Sie dazu bringen, die " rebase
" -Funktion von Git zu verwenden.