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
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.
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.
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.
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
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
'' 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. –
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.
- 1. Git Stash zwei Zweige
- 2. Git - Switching Zweige (Fenster) & nicht committed Änderungen
- 3. git Änderungen von einem Commit auf einen anderen Zweig anwenden
- 4. Warum schiebt Git in diesem Git Push auf zwei Zweige?
- 5. Änderungen von Master in alle Zweige mit Git zusammenführen?
- 6. Diffing zwei Zweige zu zeigen Änderungen in einem Zweig
- 7. "Merge" zwei identische Zweige
- 8. git Zweige von Browser
- 9. Git Rebasing mehrere Zweige
- 10. Warum verschmelzt Git, zwei Zweige sind aktuell?
- 11. Zwei Git Zweige in einer Datei unterscheiden
- 12. Git zwischen zwei Ordnern zusammenführen, nicht Zweige
- 13. Git - Gitlab Zweige
- 14. Wie zwei Zweige mit Git verschmelzen?
- 15. Split ein Git Zweig in zwei Zweige?
- 16. git merge zwei Zweige mit verschiedenen Verzeichnisstrukturen
- 17. Änderungen im Unterordner über alle Git-Zweige hinweg beibehalten
- 18. Bring Git Zweige synchron
- 19. Git Verzweigung & lokale Änderungen
- 20. 2 Zweige in GIT zusammenfügen
- 21. Zwei git Zweige zusammenführen, die ich nicht besitze
- 22. git verschmelzen zwei Zweige von einem begehen bis HEAD
- 23. Reverse Teilmenge der Änderungen von Git-Zweig
- 24. 50 Git Zweige löschen?
- 25. Zweige Git: Tracking-Upstream
- 26. Merge 2 GIT-Zweige
- 27. Mehrere Zweige in Git markieren?
- 28. git Zweige in separaten Ordnern
- 29. Git zeigt nicht alle Zweige auf lokale
- 30. Gitlab merge zwei Zweige zusammen
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. –
@ 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
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? –