2017-07-18 3 views
2

Ich habe zwei Filialen in meinem Repository (für die Zwecke dieser Frage): master und performance_testing. Ich habe Änderungen für den Zweig master erhalten. Ich muss sie auch in performance_testing setzen. Ich muss die beiden Zweige existent und getrennt halten, so dass eine Verschmelzung nicht angebracht wäre. Ich denke, ich könnte die Änderungen in einem Zweig einführen und übernehmen, dann mache ich das gleiche in dem anderen Zweig. Aber das scheint fehleranfällig zu sein, und ich würde denken, dass Git etwas direkter dazu in der Lage wäre. Wie mache ich das?Git: Anwenden von Änderungen auf zwei Zweige

Antwort

2

Häufig würden Sie in diesem Szenario cherry picking tun, was bedeutet, dass nur eine Untergruppe der Commits einer Verzweigung auf eine andere angewendet wird.

Zum Beispiel haben Sie verpflichtet A, B, C, D, E, F auf master und Sie möchten bringen verpflichtet B, C und D in performance_testing:

git checkout performance_testing 
git cherry-pick B^..D 

Oder Sie können einzelne Commits Liste in mehreren, individuellen Cherry-Pick-Befehlen. Dies ist nützlich, wenn Sie nicht unbedingt eine kontinuierliche Reihe von Commits wünschen. Zum Beispiel:

git cherry-pick B D 

Beachten Sie, dass B vor D in der Geschichte kommt.

Für weitere Details, siehe: How to cherry-pick multiple commits (die auch einige große Diagramme enthält, werde ich nicht in diese Antwort pauschalieren).

Ja, es gibt viele verschiedene Optionen zur Auswahl. Dies ist eine grundlegende und gemeinsame Lösung, die der Leser jetzt anwenden kann, wenn er versteht, wie er funktioniert. git rebase --onto ist eine weitere Option, ebenso wie eine andere Filialverwaltung, aber ohne ein ganz bestimmtes Szenario im Auge zu behalten, sollte die Rosinenpickerei die meisten Kilometer erreichen.

+0

Danke. Machte dies. Sieht so aus, als ob die Änderungen in ein Commit übernommen wurden. Das Lustige ist, es sieht so aus, als wäre das Commit im Master-Zweig. Wenn ich 'performance_testing' auschecke, zeigt git log den letzten Eintrag als SHA 348f3e ... in * master * an, und wenn ich 'master' auschecke, zeigt git log den letzten Eintrag als SHA 825f44 ... im Master an. Das scheint merkwürdig. Ist das richtig? Was passiert, wenn ich versuche, später in 'performance_timing' zu committen? Vielen Dank. –

+0

@ bob.sacamento Dies ist normal, da der Vorfahre des Commits Teil der Daten ist, die verwendet werden, um den Hash des Commits zu machen, so dass das gleiche diff mit verschiedenen Elternteilen unterschiedliche IDs hat. So können Sie 'git cherry-pick' beispielsweise mit einem * commit-ish * alleine verwenden. – msanford

+0

Danke nochmal. Nun, wenn ich 'performance_testing' auschecke und einige Änderungen und Commits mache, wird das Commit auf 'performance_testing', wie ich hoffe, oder auf' master' gehen? –

1

Sie können git cherry-pick verwenden, um Kopien eines oder mehrerer Commits auf einen neuen Zweig anzuwenden.

Die neuen Commits "haben die gleiche Wirkung wie die Originale (gleiches Diff, gleiche Nachricht usw.), sind aber ansonsten unabhängig.

2

Der beste Ansatz wäre, einen Feature-Zweig für die Änderungen zu erstellen und am Ende unter master und performance_testing zusammenzuführen. Cherry-Picking gilt als Anti-Pattern.

+0

So mag ich es, Dinge zu tun, obwohl ich selbst nicht so weit gehen würde als "Anti-Muster", ich halte es für einen Urteilsspruch, Nachteile in beiden Richtungen, um mit den Vorteilen zu gehen und das Gleichgewicht zu finden. Aber ich mache den Merge-Call immer selbst. Ich verstehe nicht sinnlose Zusammenführung commits, aber ich verstehe nicht, dass ich bedeutungslose mag. – jthill

+1

Ich verstehe diese Antwort nicht: ist nicht 'performance_testing' * der Feature-Zweig * in diesem Fall. Vermutlich wurde ein Code aus einem anderen Zweig in "Master" zusammengeführt und diese Änderungen müssen auf Leistung getestet werden? – msanford

+0

'' performance_testing'' ist ein Feature-Zweig, aber wir brauchen einen separaten Zweig für die neuen Änderungen. Sie sind üblich für 'Master' und' 'Performance_Testing'' und können daher in einen separaten Feature-Zweig gestellt werden. –

1

Ich muss die beiden Zweige existent und getrennt halten, so dass die Zusammenführung nicht angemessen wäre.

Das folgt nicht unbedingt; nach einer Zusammenführung existieren noch zwei Zweige und sind noch getrennt. Der Fall, in dem das Zusammenführen unpassend wäre, ist, wenn jeder Zweig derzeit Änderungen enthält, die nicht in dem anderen enthalten sein können.

Wenn Sie sagen, dass Sie "Änderungen für den Zweig master erhalten haben", was genau bedeutet das? Wenn Sie meinen, jemand schob Änderungen an der origin/master, dann begrenzt das Ihre Möglichkeiten.Was ansonsten die beste Lösung wäre (Erstellen einer Verzweigung bei einer Zusammenführungsbasis zwischen master und performance_testing, Anwenden der Änderungen dort und dann Zusammenführen dieser Verzweigung in sowohl master als auch performance_testing) würde durch die Notwendigkeit eines Historienumschreibens kompliziert werden, das bereits geteilte Daten betrifft Commits (um die direkte Anwendung der Änderungen auf master zu entfernen).

Wenn die Änderungen direkt an master angewendet wurden, und master enthält Änderungen, die nicht in performance_testing gebracht werden kann: dann, wenn nicht eine Geschichte Rewrite koordinierende akzeptabel ist, weitere Option ist wahrscheinlich, um die Änderung herauspicken. Meiner Meinung nach ist Rosinenpicken Weg zu oft und hat erhebliche Nachteile, aber wenn Sie jede andere Lösung ausgeschlossen haben, dann ist das, was bleibt.