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


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 .


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]

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.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.