Ich habe BranchA
113 Commits vor mir BranchB
.
Aber ich möchte nur, dass die letzten 10 Commits BranchA
zusammengeführt werden BranchB
.
Gibt es eine Möglichkeit, dies zu tun?
Ich habe BranchA
113 Commits vor mir BranchB
.
Aber ich möchte nur, dass die letzten 10 Commits BranchA
zusammengeführt werden BranchB
.
Gibt es eine Möglichkeit, dies zu tun?
Antworten:
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 .
A
abgezweigt von master
und Sie tun einiges an Arbeit auf sie, die Schaffung Kind Commits B
durch E
. Angenommen, es wurde E
nur 1 Zeile von hinzugefügt D
. Wenn Sie git cherry-pick E
in master
, wendet es alle Änderungen von A
bis E
in den master
Zweig an, oder wendet es nur die Änderung von D
bis 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)
Wenn BranchA nicht auf eine Fernbedienung übertragen wurde, können Sie die Commits mit rebase
und dann einfach neu anordnen merge
. Es ist vorzuziehen , zu verwenden merge
über , rebase
wenn 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]
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:
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:
Jetzt können Sie Ihren Themenzweig entfernen und die Commits löschen, die Sie nicht abrufen wollten.