Anwenden der Änderungen von Zweig b auf a, ohne Commits zusammenzuführen oder hinzuzufügen

85

Mein Szenario ist, dass ich einen Zweig habe, in dem ich den Erstellungsprozess stark verbessert habe (Zweig A), und in einem anderen arbeite ich an einer nicht verwandten Funktion (Zweig B). Wenn ich mich jetzt in Zweig B abhacke, möchte ich das Zeug einholen, das ich in Zweig A geschrieben habe, weil ich schnellere und einfachere Builds möchte. Ich möchte jedoch meinen Zweig B nicht "verschmutzen", sondern nur Änderungen von Zweig A zu nicht bereitgestellten Änderungen hinzufügen.

Was ich versucht habe (wenn ich auf Zweig B stehe):

git merge --no-commit branchA

Funktioniert nicht, weil Sie dadurch zusammengeführt werden. Wenn es nicht wäre, wäre es perfekt.

git checkout branchA -- .

Funktioniert nicht, da Änderungen zwischen branchA..branchB und nicht zwischen dem Änderungsmaster..branchA angewendet werden.

Noch etwas?

Bearbeiten: Ja, Änderungen in Zweig A werden festgeschrieben. In diesem Beispiel gibt es nur einen Zweig mit Build-Verbesserungen, es können jedoch bis zu N Zweige mit Build-Verbesserungen vorhanden sein, die ich bei der Arbeit an einem Feature-Zweig anwenden möchte.

Björn Lindqvist
quelle
Sind die Änderungen an A bereits festgeschrieben?
Theolodis

Antworten:

151

Ich musste nur etwas Ähnliches tun und konnte es durch Hinzufügen --squashzum Befehl zum Zusammenführen beheben

git merge --no-commit --squash branchA
git reset HEAD # to unstage the changes
guilffer
quelle
3
Dies sollte auch eine Erläuterung dazu enthalten, was es ebenfalls tut. Es inszeniert den Unterschied der Änderungen von Zweig A in Ihren aktuellen Zweig
KareemElashmawy
Nehmen wir an, ich habe gerade Code von branchA in master zusammengeführt, aber ich habe etwas vergessen und möchte ein paar weitere Codes / Änderungen zu diesem Zusammenführungs-Commit hinzufügen, ohne als ein weiteres Merge-Commit im Git-Verlauf angezeigt zu werden. Wird diese Methode funktionieren?
Sushmit Sagar
@ Sushmit Ich denke, Sie können ein tun git commit —amendund es wird die neuen Änderungen an das letzte Commit anhängen. Ich bin mir nur nicht ganz sicher, ob es bei Merge-Commits
funktioniert
1
Ich glaube nicht, dass hier kein Commit benötigt wird? Sollte die Standardeinstellung sein.
Petter
11

cherry-pick -n sollte tun, was Sie wollen, aber ich bin mir nicht sicher, warum Sie die Build-Verbesserungen als nicht bereitgestellte Änderungen wünschen - das erschwert nur einige Dinge (z. B. das Zusammenführen anderer Änderungen an den geänderten Dateien oder das erneute Basieren von Elementen).

In diesem Beispiel gibt es nur einen Zweig mit Build-Verbesserungen, es können jedoch bis zu N Zweige mit Build-Verbesserungen vorhanden sein, die ich bei der Arbeit an einem Feature-Zweig anwenden möchte.

In diesem Fall würde ich einen neuen Zweig C erstellen, den Sie sowohl aus A als auch aus B (und allen anderen Zweigen mit Build-Verbesserungen) zusammenführen. Übernehmen Sie die Änderungen im Feature-Zweig B und führen Sie sie dann in den C-Zweig ein, der jetzt die Build-Verbesserungen und die Änderungen im Feature-Zweig enthält, damit Sie sie gemeinsam testen können. Wenn Sie weitere Änderungen vornehmen müssen, tun Sie dies in der entsprechenden Verzweigung, nicht in C, und führen Sie sie dann zu C zusammen. Ändern Sie also niemals etwas in der C-Verzweigung, sondern verwenden Sie sie einfach, um Änderungen aus anderen Verzweigungen zu integrieren.

Das bedeutet, dass Sie alle Funktionen von Git in Zweig C verwenden können, anstatt nicht festgeschriebene Änderungen in einem schmutzigen Baum zu jonglieren.

Jonathan Wakely
quelle
UseCase für cherry-pick -n: Ich habe eine Arbeitskopie meines Codes erstellt, indem ich zufälligen Stellen viele Dinge hinzugefügt habe. Jetzt möchte ich meinen Code bereinigen, bevor ich mich für den Zweig dieser Funktion begebe. Also wechsle ich zu einem temporären Zweig, festschreibe alle Änderungen. Kommen Sie zurück zum Feature-Zweig, cherry-pickder festschreibt. Gibt es einen besseren Weg, dies zu tun?
Tejas Kale
6

Sie sollten in der Lage sein, die Commits auszuwählen (mit -n, um ein sofortiges Commit zu vermeiden).

Lucero
quelle
-n hat nicht funktioniert. Es heißt, dass keine -m-Option bei einem Cherry-Pick-Commit fehlgeschlagen ist.
Alejandro Sanz Díaz
5

Ich bin nicht 100% sicher, ob ich es klar verstanden habe, aber in meinem Fall habe ich gerade einen Diff-Patch zwischen Zweigen erstellt und diesen Pfad dann auf den B-Zweig angewendet.

Innerhalb von Zweig A:

 git diff branchA..branchB > patch.diff
 git apply patch.diff
sobi3ch
quelle
4

Ich bin mir nicht sicher, ob ich Ihre Anforderungen verstehe.

Sie können eine Zusammenführung ausführen und dann aufrufen git reset HEAD~1.


Die folgende Sequenz sollte jedes Commit zwischen masterund branchAüber abspielen branchB. Commits, die bereits angewendet wurden branchB, werden übersprungen.

# start from branchA
git checkout branchA
# create a temporary branch wip
git checkout -b wip
# use rebase to replay each commit between master and wip on branchB
git rebase --onto branchB master wip

# if you want to remove all the commit history and only keep the resulting diffs,
# use git reset
git reset branchB

# change the active branch
git checkout branchB
# remove temp branch
git branch -d wip
LeGEC
quelle
Das fügt Dateien zum Staging-Bereich von git hinzu, die ich nicht möchte. Außerdem scheint es nur dann gut zu funktionieren, wenn alle Zweige vom gleichen Commit auf dem Hauptzweig verzweigt sind. Ansonsten werden Unterschiede nicht im Bereich master..branchA eingeführt.
Björn Lindqvist
@ BjörnLindqvist: Entfernen Sie die --softOption, wenn Sie die Änderungen im bereitgestellten Bereich nicht möchten. Können Sie ein Diagramm zeichnen, wie Ihre Zweige eingerichtet sind?
LeGEC