Ich habe zwei Zweige von meinem Meister:
- v2.1 : (Version 2) Ich arbeite seit mehreren Monaten daran
- wss : das ich gestern erstellt habe, um meinem Master eine bestimmte Funktion hinzuzufügen (in Produktion)
Gibt es eine Möglichkeit, die gestrigen Commits von wss nach v2.1 zu kopieren?
git
branching-and-merging
Bob Walsh
quelle
quelle
Antworten:
Sie sollten wirklich einen Workflow haben, mit dem Sie dies alles durch Zusammenführen tun können:
Alles was Sie tun müssen ist
git checkout v2.1
undgit merge wss
. Wenn Sie dies aus irgendeinem Grund wirklich nicht tun können und Sie git rebase nicht verwenden können , um Ihren wss-Zweig an die richtige Stelle zu verschieben, lautet der Befehl, ein einzelnes Commit von irgendwoher abzurufen und an anderer Stelle anzuwenden, git cherry-pick . Schauen Sie sich einfach den Zweig an, auf den Sie ihn anwenden möchten, und führen Sie ihn ausgit cherry-pick <SHA of commit to cherry-pick>
.Einige der Möglichkeiten, wie Rebase Sie retten kann:
Wenn Ihre Geschichte so aussieht:
Sie können
git rebase --onto v2 v2-only wss
wss verwenden , um wss direkt auf v2 zu verschieben:Dann können Sie zusammenführen! Wenn Sie wirklich, wirklich, wirklich nicht an den Punkt gelangen, an dem Sie zusammenführen können, können Sie Rebase verwenden, um mehrere Kirschpicks gleichzeitig effektiv auszuführen:
Hinweis: Der Grund dafür ist zusätzliche Arbeit, da doppelte Commits in Ihrem Repository erstellt werden. Dies ist nicht wirklich eine gute Sache - der springende Punkt beim einfachen Verzweigen und Zusammenführen ist, dass Sie alles tun können, indem Sie Commits an einem Ort platzieren und sie dort zusammenführen, wo sie benötigt werden. Doppelte Commits bedeuten die Absicht, diese beiden Zweige niemals zusammenzuführen (wenn Sie sich später dazu entschließen, treten Konflikte auf).
quelle
git-svn-id
Referenzen zu entfernen, bevor ich sie erneut erfülledcommit
. Obwohl ich wahrscheinlich den Kirschpflückschritt hätte weglassen und einfach eine Rebase alleine verwenden können.Verwenden
um sich
<commit>
auf Ihre aktuelle Niederlassung zu bewerben .Ich selbst würde wahrscheinlich die Commits, die ich eingebe, überprüfen
gitk
und sie stattdessen mit Rechtsklicks auf den Commit-Eintrag dort auswählen.Wenn Sie automatischer vorgehen möchten (mit all seinen Gefahren) und davon ausgehen möchten, dass alle Commits seit gestern auf wss stattgefunden haben, können Sie die Liste der Commits mit
git log
(--pretty
von Jefromi vorgeschlagen) erstellen.Also alles zusammen, vorausgesetzt du verwendest
bash
Wenn hier etwas schief geht (es gibt viel Potenzial), sind Sie in Schwierigkeiten, da dies beim Live-Checkout funktioniert. Führen Sie also entweder manuelle Cherry-Picks durch oder verwenden Sie die von Jefromi vorgeschlagene Rebase.
quelle
git rebase
in meiner Antwort verwendete Methode robuster ist , vorausgesetzt, Sie möchten wirklich doppelte Commits erstellen . Insbesondere bei Verwendung einer solchen for-Schleife wird immer noch versucht, den Rest zu erledigen, wenn einer der Cherry-Picks fehlschlägt. Das ist ... sehr, nicht gut, sagen wir mal.git
Antwort, die einfach und direkt zur Lösung führt, anstatt sich durch die Feinheiten von git zu schlängeln, um zu beweisen, wie gut der Antwortende es weiß.git cherry-pick
: Übernehmen Sie die Änderungen, die durch einige vorhandene Commits eingeführt wurdenAngenommen, wir haben Zweig A mit (X, Y, Z) Commits. Wir müssen diese Commits zu Zweig B hinzufügen . Wir werden die
cherry-pick
Operationen nutzen.Wenn wir verwenden
cherry-pick
, sollten wir Commits in Zweig B in derselben chronologischen Reihenfolge hinzufügen, in der die Commits in Zweig A erscheinen .Cherry-Pick unterstützt zwar eine Reihe von Commits, aber wenn Sie Commits in diesem Bereich zusammenführen, wird dies sehr kompliziert
Beispiel für einen Workflow:
Wir können
cherry-pick
mit Optionen verwenden-e oder --edit : Mit dieser Option können Sie mit git cherry-pick die Festschreibungsnachricht vor dem Festschreiben bearbeiten.
-n oder --no-commit : Normalerweise erstellt der Befehl automatisch eine Folge von Commits. Dieses Flag wendet die Änderungen an, die erforderlich sind, um jedes benannte Commit für Ihren Arbeitsbaum und den Index auszuwählen, ohne ein Commit vorzunehmen. Wenn diese Option verwendet wird, muss Ihr Index außerdem nicht mit dem HEAD-Commit übereinstimmen. Die Auswahl erfolgt gegen den Anfangszustand Ihres Index.
Hier ist ein interessanter Artikel über
cherry-pick
.quelle
Sie können aus den Commits, die Sie kopieren möchten , einen Patch erstellen und den Patch auf den Zielzweig anwenden .
quelle
git format-patch <revision range>
undgit am *.patch
.checkout
zu einem anderen Zweig.Oder wenn Sie etwas weniger auf der Seite des Evangelisten stehen, können Sie ein wenig hässlich vorgehen, wie ich es benutze. In deploy_template gibt es Commits, die ich als Zweigbereitstellung auf meinen Master kopieren möchte
Dadurch wird eine neue Zweigbereitstellung (ich verwende -f, um den vorhandenen Bereitstellungszweig zu überschreiben) auf deploy_template erstellt. Anschließend wird dieser neue Zweig auf den Master zurückgesetzt, wobei deploy_template unberührt bleibt.
quelle
Für den einfachen Fall, dass nur das letzte Commit von Zweig wss nach v2.1 kopiert wird, können Sie einfach die Commit-ID (
git log --oneline | head -n 1
) abrufen und Folgendes tun:quelle
Der Cherry-Pick-Befehl kann die Liste der Commits aus der Standardeingabe lesen.
Der folgende Befehl Cherry-Picks schreibt vom Benutzer John erstellte Commits fest, die im Zweig "Entwickeln", jedoch nicht im Zweig "Freigeben" vorhanden sind, und zwar in chronologischer Reihenfolge.
quelle