Beide rebase
(und cherry-pick
) und merge
haben ihre Vor- und Nachteile. Ich argumentiere merge
hier, aber es lohnt sich, beide zu verstehen. (Suchen Sie hier nach einer alternativen, gut argumentierten Antwort, in der Fälle aufgelistet werden, in denen dies rebase
bevorzugt wird.)
merge
über bevorzugt cherry-pick
und rebase
für ein paar Gründe.
- Robustheit . Die SHA1-Kennung eines Commits identifiziert es nicht nur an und für sich, sondern auch in Bezug auf alle anderen Commits, die ihm vorausgehen. Dies bietet Ihnen eine Garantie dafür, dass der Status des Repositorys bei einem bestimmten SHA1 für alle Klone identisch ist. Es besteht (theoretisch) keine Chance, dass jemand die gleiche Änderung vorgenommen hat, aber tatsächlich Ihr Repository beschädigt oder entführt. Sie können einzelne Änderungen auswählen und sie sind wahrscheinlich gleich, aber Sie haben keine Garantie. (Als kleines sekundäres Problem nehmen die neuen Commits, die von Kirschen gepflückt wurden, zusätzlichen Platz ein, wenn jemand anderes erneut Kirschen auswählt, da beide in der Historie vorhanden sind, selbst wenn Ihre Arbeitskopien identisch sind.)
- Benutzerfreundlichkeit . Die Leute neigen dazu, den
merge
Workflow ziemlich leicht zu verstehen . rebase
neigt dazu, als fortgeschrittener angesehen zu werden. Es ist am besten, beides zu verstehen, aber Leute, die keine Experten für Versionskontrolle sein wollen (zu denen meiner Erfahrung nach viele Kollegen gehören, die verdammt gut in dem sind, was sie tun, aber keine zusätzliche Zeit verbringen wollen), haben es leichter Zeit nur verschmelzen.
Auch bei einem zusammenführungsintensiven Workflow rebase
und cherry-pick
für bestimmte Fälle immer noch nützlich:
- Ein Nachteil
merge
ist die überfüllte Geschichte. rebase
verhindert, dass eine lange Reihe von Commits in Ihrem Verlauf verstreut wird, wie dies der Fall wäre, wenn Sie die Änderungen anderer regelmäßig zusammenführen würden. Das ist in der Tat sein Hauptzweck, wie ich es benutze. Was Sie sehr vorsichtig sein möchten , ist niemals rebase
Code, den Sie mit anderen Repositorys geteilt haben. Sobald ein Commit push
bearbeitet wurde, hat möglicherweise jemand anderes darüber geschrieben, und ein erneutes Basieren führt bestenfalls zu der oben beschriebenen Art der Duplizierung. Im schlimmsten Fall kann es zu einem sehr verwirrten Repository und subtilen Fehlern kommen. Das Aufspüren dauert lange.
cherry-pick
ist nützlich, um eine kleine Teilmenge von Änderungen aus einem Themenzweig herauszufiltern, den Sie grundsätzlich verworfen haben, aber festgestellt haben, dass es einige nützliche Teile gibt.
Wenn Sie es vorziehen, viele Änderungen einer vorzuziehen, ist dies viel einfacher. Es kann sehr mühsam werden, einzelne Änderungssätze zusammenzuführen, sobald Sie viele davon haben. Die Zusammenführungsauflösung in git (und in Mercurial und in Bazaar) ist sehr, sehr gut. Sie werden die meiste Zeit nicht auf große Probleme stoßen, selbst lange Zweige zusammenzuführen. Im Allgemeinen füge ich alles auf einmal zusammen und nur wenn ich eine große Anzahl von Konflikten bekomme, mache ich eine Sicherungskopie und führe die Zusammenführung stückweise erneut aus. Selbst dann mache ich es in großen Stücken. Als sehr reales Beispiel hatte ich einen Kollegen, der Änderungen im Wert von 3 Monaten zum Zusammenführen hatte und 9000 Konflikte in der 250000-Zeilencodebasis hatte. Was wir getan haben, um das Problem zu beheben, ist die Zusammenführung im Wert von jeweils einem Monat: Konflikte bauen sich nicht linear auf, und wenn Sie dies in Teilen tun, führt dies zu einer weitreichenden Auswirkungweniger als 9000 Konflikte. Es war immer noch viel Arbeit, aber nicht so viel wie der Versuch, es einzeln zu tun.
Meiner Meinung nach sollte das Kirschpflücken für seltene Situationen reserviert werden, in denen es erforderlich ist, z. B. wenn Sie einige Korrekturen direkt am Hauptzweig (Stamm, Hauptentwicklungszweig) vorgenommen haben und dann erkannt haben, dass es auch auf die Wartung angewendet werden sollte '. Sie sollten den Workflow entweder auf Merge oder auf Rebase (oder "git pull --rebase") basieren.
Bitte denken Sie daran , dass Kirschverlesen oder umbasiert Commit verschieden vom Standpunkt der Git (hat verschiedenen SHA-1 identifier) als das Original, so dass er anders als die in entfernten Repository begehen. (Rebase kann normalerweise damit umgehen, da es die Patch-ID überprüft, dh die Änderungen, keine Commit-ID.)
Auch in Git können Sie viele Zweige gleichzeitig zusammenführen: das sogenannte Octopus Merge . Beachten Sie, dass die Octopus-Zusammenführung ohne Konflikte erfolgreich sein muss. Trotzdem könnte es nützlich sein.
HTH.
quelle
git blame
Finden des Commits, das den Fehler verursacht hat, undgit branch --contains
Bestimmen, wo der Zweig zusammengeführt werden soll. Ausführlicher beschrieben in diesem BeitragRebase und Cherry-Pick sind die einzige Möglichkeit, den Commit-Verlauf sauber zu halten. Vermeiden Sie die Verwendung von Zusammenführungen und vermeiden Sie das Erstellen von Zusammenführungskonflikten. Wenn Sie gerrit verwenden, setzen Sie ein Projekt bei Bedarf auf Zusammenführen und ein Projekt auf den Cherry-Pick-Modus und versuchen Sie es selbst.
quelle