Wie füge ich in Git ein bestimmtes Commit von einem Zweig in einen anderen zusammen?

159

Ich habe BranchA113 Commits vor mir BranchB.

Aber ich möchte nur, dass die letzten 10 Commits BranchAzusammengeführt werden BranchB.

Gibt es eine Möglichkeit, dies zu tun?

NullVoxPopuli
quelle
6
mögliches Duplikat von Wie man ein bestimmtes Commit in git
chharvey zusammenführt

Antworten:

233

Das git cherry-pick <commit> Befehl können Sie ein einzelnes Commit (von einem beliebigen Zweig) ausführen und es im Wesentlichen in Ihrem Arbeitszweig neu starten.

Kapitel 5 des Pro Git-Buches erklärt es besser als ich kann , einschließlich Diagrammen und dergleichen. (( Das Kapitel über das Wiederherstellen ist auch gut zu lesen.)

Schließlich gibt es einige gute Kommentare zum Thema Kirschernte vs. Zusammenführen vs. Umbasieren in einer anderen SO-Frage .

ewall
quelle
1
Frage: etwa commit Aabgezweigt von masterund Sie tun einiges an Arbeit auf sie, die Schaffung Kind Commits Bdurch E. Angenommen, es wurde Enur 1 Zeile von hinzugefügt D. Wenn Sie git cherry-pick Ein master, wendet es alle Änderungen von Abis Ein den masterZweig an, oder wendet es nur die Änderung von Dbis an E, nämlich fügt es nur diese 1 Zeile hinzu master? Wenn der Fall der erstere ist, wie erreiche ich den letzteren? (abgesehen vom manuellen Kopieren und Einfügen)
chharvey
7
git cherry-pick -n <commit> Wenn Sie nicht möchten, dass der Cherry-Pick automatisch festgeschrieben wird.
Ben Flynn
6

Wenn BranchA nicht auf eine Fernbedienung übertragen wurde, können Sie die Commits mit rebaseund dann einfach neu anordnen merge. Es ist vorzuziehen , zu verwenden mergeüber , rebasewenn möglich , weil es keine doppelten Commits schafft.

git checkout BranchA
git rebase -i HEAD~113
... reorder the commits so the 10 you want are first ...
git checkout BranchB
git merge [the 10th commit]
Seth Reno
quelle
2

QUELLE: https://git-scm.com/book/en/v2/Distributed-Git-Maintaining-a-Project#Integrating-Contributed-Work

Die andere Möglichkeit, eingeführte Arbeiten von einem Zweig in einen anderen zu verschieben, besteht darin, sie auszuwählen. Ein Cherry-Pick in Git ist wie eine Rebase für ein einzelnes Commit. Es nimmt den Patch, der in einem Commit eingeführt wurde, und versucht, ihn erneut auf den Zweig anzuwenden, in dem Sie sich gerade befinden. Dies ist nützlich, wenn Sie mehrere Commits in einem Themenzweig haben und nur eines davon integrieren möchten, oder wenn Sie nur ein Commit in einem Themenzweig haben und es vorziehen, es auszuwählen, anstatt Rebase auszuführen. Angenommen, Sie haben ein Projekt, das folgendermaßen aussieht:

Geben Sie hier die Bildbeschreibung ein

Wenn Sie Commit e43a6 in Ihren Hauptzweig ziehen möchten, können Sie ausführen

$ git cherry-pick e43a6
Finished one cherry-pick.
[master]: created a0a41a9: "More friendly message when locking the index fails."
 3 files changed, 17 insertions(+), 3 deletions(-)

Dadurch wird dieselbe Änderung wie in e43a6 eingeführt, Sie erhalten jedoch einen neuen Commit-SHA-1-Wert, da das angewendete Datum unterschiedlich ist. Jetzt sieht deine Geschichte so aus:

Geben Sie hier die Bildbeschreibung ein

Jetzt können Sie Ihren Themenzweig entfernen und die Commits löschen, die Sie nicht abrufen wollten.

artamonovdev
quelle