it-swarm.com.de

Wie kann man Commits von einem Zweig in einen anderen kopieren?

Ich habe zwei Zweige von meinem Meister:

  • v2.1 : (Version 2) Ich habe mehrere Monate daran gearbeitet
  • wss : das ich gestern erstellt habe, um meinem Master eine bestimmte Funktion hinzuzufügen (in Produktion)

Gibt es eine Möglichkeit, die Commits von gestern von wss auf v2.1 zu kopieren?

575
Bob Walsh

Sie sollten wirklich einen Workflow haben, mit dem Sie dies alles durch Zusammenführen tun können:

- x - x - x (v2) - x - x - x (v2.1)
           \
            x - x - x (wss)

Alles, was Sie tun müssen, ist git checkout v2.1 und git merge wss. Wenn dies aus irgendeinem Grund nicht möglich ist und Sie git rebase nicht verwenden können, um Ihren wss-Zweig an die richtige Stelle zu verschieben, geben Sie den Befehl ein, um einen einzelnen Commit von irgendwoher abzurufen und an einer anderen Stelle anzuwenden ist Git Cherry-Pick . Schauen Sie sich einfach den Zweig an, auf den Sie ihn anwenden möchten, und führen Sie git cherry-pick <SHA of commit to cherry-pick> aus.

Einige der Möglichkeiten, wie Rebase Sie retten kann:

Wenn Ihre Geschichte so aussieht:

- x - x - x (v2) - x - x - x (v2.1)
           \
            x - x - x (v2-only) - x - x - x (wss)

Sie können git rebase --onto v2 v2-only wss verwenden, um wss direkt auf v2 zu verschieben:

- x - x - x (v2) - x - x - x (v2.1)
          |\
          |  x - x - x (v2-only)
           \
             x - x - x (wss)

Dann kannst du verschmelzen! Wenn Sie wirklich, wirklich, wirklich nicht an den Punkt gelangen, an dem Sie zusammenführen können, können Sie mit rebase immer noch effektiv mehrere Cherry-Picks bei ausführen Einmal:

# wss-starting-point is the SHA1/branch immediately before the first commit to rebase
git branch wss-to-rebase wss
git rebase --onto v2.1 wss-starting-point wss-to-rebase
git checkout v2.1
git merge wss-to-rebase

Hinweis: Der Grund dafür, dass zusätzliche Arbeit erforderlich ist, besteht darin, dass in Ihrem Repository doppelte Commits erstellt werden. Dies ist keine gute Sache - der springende Punkt beim einfachen Verzweigen und Zusammenführen ist, dass Sie in der Lage sind, alles zu tun, indem Sie Commits an einer Stelle zusammenführen, wo immer sie benötigt werden. Doppelte Commits bedeuten, dass diese beiden Zweige niemals zusammengeführt werden sollen (wenn Sie dies später möchten, treten Konflikte auf).

518
Cascabel

Benutzen 

git cherry-pick <commit>

<commit> auf Ihre aktuelle Niederlassung anwenden. 

Ich selbst würde wahrscheinlich die Commits, die ich in gitk auswähle, überprüfen und sie stattdessen mit Rechtsklicks auf den Commit-Eintrag auswählen.


Wenn Sie automatisierter werden möchten (mit all seinen Gefahren) und unter der Annahme, dass alle Commits seit gestern auf wss passiert sind, können Sie die Liste der Commits mithilfe von git log mit (--pretty von Jefromi vorgeschlagen) erstellen.

git log --reverse --since=yesterday --pretty=%H

also alles zusammen, vorausgesetzt, Sie verwenden bash

for commit in $(git log --reverse --since=yesterday --pretty=%H);
do
    git cherry-pick $commit
done

Wenn hier etwas schief geht (es gibt viel Potenzial), sind Sie in Schwierigkeiten, da dies beim Live-Checkout funktioniert. Entweder manuelle Kirschpicks oder die von Jefromi empfohlene Rebase verwenden.

750

git cherry-pick: Wenden Sie die Änderungen an, die durch einige vorhandene Commits vorgenommen wurden

Angenommen, wir haben Zweig A mit (X, Y, Z) Commits. Wir müssen diese Commits dem Zweig B hinzufügen. Wir werden die cherry-pick-Operationen verwenden.

Wenn wir cherry-pick verwenden, sollten wir Commits in Zweig B in derselben chronologischen Reihenfolge hinzufügen, in der die Commits in Zweig A erscheinen.

cherry Pick unterstützt eine Reihe von Commits, aber wenn Sie Commits in diesem Bereich zusammenfassen, wird es sehr kompliziert

git checkout B
git cherry-pick SHA-COMMIT-X
git cherry-pick SHA-COMMIT-Y
git cherry-pick SHA-COMMIT-Z

Beispiel für einen Workflow:

 enter image description here

Wir können cherry-pick mit Optionen verwenden

-e oder --edit: Mit dieser Option können Sie mit git cherry-pick die Commit-Nachricht vor dem Commit bearbeiten.

-n oder --no-commit: Normalerweise erstellt der Befehl automatisch eine Folge von Commits. Dieses Flag wendet die erforderlichen Änderungen an, um jedes benannte Commit in Ihrem Arbeitsbaum und dem Index auszuwählen, ohne ein Commit durchzuführen. Wenn diese Option verwendet wird, muss Ihr Index außerdem nicht mit dem Commit HEAD übereinstimmen. Die Auswahl der Kirsche erfolgt gegen den Anfangszustand Ihres Index.

Hier ein interessanter Artikel zu cherry-pick.

27
Lyes CHIOUKH

Sie können einen Patch aus den Commits erstellen, die Sie kopieren möchten, und den Patch auf den Zielzweig anwenden.

15
Charles Ma

Oder wenn Sie etwas weniger auf der Seite des Evangelisten sind, können Sie einen etwas hässlichen Weg machen, den ich benutze. In deploy_template gibt es Commits, die ich als Branch Deploy auf meinen Master kopieren möchte 

git branch deploy deploy_template
git checkout deploy
git rebase master

Dadurch wird eine neue Verzweigungsbereitstellung für deploy_template erstellt (ich verwende -f zum Überschreiben der vorhandenen Bereitstellungsverzweigung). Anschließend wird diese neue Verzweigung wieder auf dem Master erstellt, und die Bereitstellungsvorlage bleibt unverändert.

9
Petr Sykora

Für den einfachen Fall, dass nur das letzte Commit aus dem Zweig wss in Version 2.1 kopiert wird, können Sie einfach die Commit-ID (git log --oneline | head -n 1) verwenden und Folgendes tun:

git checkout v2.1
git merge <commit>
0
zeroimpl