Git Cherry-Pick vs Merge Workflow

Angenommen, ich bin der Betreuer eines Repos, und ich möchte Änderungen von einem Mitarbeiter einholen. Es gibt einige mögliche Arbeitsabläufe:

  1. Ich cherry-pick jedes Commit von der Fernbedienung (in der Reihenfolge). In diesem Fall zeichnet git das Commit als nicht mit dem entfernten Zweig verbunden auf.
  2. Ich merge den Zweig zusammen, ziehe alle Änderungen ein und füge einen neuen “Konflikt” -Commit hinzu (falls erforderlich).
  3. Ich merge jedes Commit aus dem entfernten Zweig einzeln zusammen (wiederum in der Reihenfolge), wodurch Konflikte für jedes Commit aufgezeichnet werden können, anstatt alle zusammen als eins zu gruppieren.
  4. Der Vollständigkeit rebase könnte man eine rebase (wie die cherry-pick Option?), Aber ich verstehe, dass dies für den Contributor Verwirrung rebase kann. Vielleicht beseitigt das die Option 1.

In beiden Fällen 2 und 3 zeichnet git die Verzweigungshistorie der Commits auf, im Gegensatz zu 1.

Was sind die Vor- und Nachteile zwischen der Verwendung von cherry-pick oder merge Methoden beschrieben? Mein Verständnis ist, dass Methode 2 die Norm ist, aber ich finde, dass die Lösung eines großen Commit mit einem einzigen “Konflikt” Merge, ist nicht die sauberste Lösung.

Sowohl rebase (und cherry-pick ) als auch merge haben ihre Vor- und Nachteile. Ich streite für die merge hier, aber es ist es wert beide zu verstehen. (Suchen Sie hier nach einer alternativen, gut argumentierten Antwort, die Fälle aufzählt, in denen eine rebase bevorzugt wird.)

merge rebase Gründen wird die Zusammenführung gegenüber cherry-pick und ” rebase bevorzugt.

  1. 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, dass der Zustand des Repositorys bei einem gegebenen SHA1 über alle Klone hinweg identisch ist. Es gibt (theoretisch) keine Chance, dass jemand etwas getan hat, was nach der gleichen Änderung aussieht, aber tatsächlich Ihr Repository beschädigt oder entführt. Sie können einzelne Änderungen auswählen und sie sind wahrscheinlich die gleichen, aber Sie haben keine Garantie. (Als geringfügiges sekundäres Problem werden die neuen, sorgfältig ausgewählten Commits zusätzlichen Platz einnehmen, wenn jemand anderes das gleiche Commit erneut durchführt, da beide in der Geschichte vorhanden sind, selbst wenn Ihre Arbeitskopien identisch sind.)
  2. Benutzerfreundlichkeit . Menschen neigen dazu, den merge Workflow relativ einfach zu verstehen. rebase tendenziell als fortgeschrittener angesehen. Es ist am besten, beides zu verstehen, aber Leute, die keine Experten in der Versionskontrolle sein wollen (was meiner Erfahrung nach viele Kollegen enthalten hat, die verdammt gut darin sind, was sie tun, aber die zusätzliche Zeit nicht ausgeben wollen), haben es leichter Zeit nur zusammenfließen.

Selbst mit einem schwerfälligen Workflow sind rebase und cherry-pick für bestimmte Fälle immer noch nützlich:

  1. Ein Nachteil zu merge ist überladene Geschichte. rebase verhindert, dass eine lange Reihe von Commits in Ihrer Geschichte verstreut wird, wie sie es wären, wenn Sie sich periodisch in die Änderungen anderer rebase würden. Das ist in der Tat der Hauptzweck, wie ich es benutze. Worauf Sie sehr vorsichtig sein möchten, ist, dass Sie Code, den Sie mit anderen Repositories geteilt haben, niemals rebase erstellen. Sobald ein Commit durchgesetzt wurde, hat sich möglicherweise jemand anderes darüber hinweggesetzt, und Rebasing wird im besten Fall die Art von Duplizierung verursachen, die oben diskutiert wurde. Im schlimmsten Fall kann es zu einem sehr konfusen Repository und subtilen Fehlern kommen, die Sie lange brauchen werden.
  2. cherry-pick ist nützlich, um eine kleine Teilmenge von Änderungen aus einem Themenzweig herauszupicken, die Sie im Grunde genommen vercasting möchten, aber Sie haben bemerkt, dass es ein paar nützliche Stücke darauf gibt.

Wie zu bevorzugen, viele Änderungen über eins zu merge: Es ist nur viel einfacher. Es kann sehr mühsam werden, Fusionen einzelner Changesets durchzuführen, wenn Sie viele davon haben. Die Zusammenführungsauflösung in git (und in Mercurial und in Bazaar) ist sehr, sehr gut. Sie werden nicht auf große Probleme stoßen, die sogar lange Zweige die meiste Zeit zusammenführen. Ich füge im Allgemeinen alles auf einmal zusammen und nur wenn ich eine große Anzahl von Konflikten bekomme, werde ich die Zusammenführung stückweise wiederholen. Selbst dann mache ich es in großen Stücken. Als ein sehr reales Beispiel hatte ich einen Kollegen, der 3 Monate lang Änderungen hatte, um zu merge, und ungefähr 9000 Konflikte in 250000 Zeilencode-Basis bekam. Was wir behoben haben, ist, dass die Zusammenführung jeweils einen Monat lang durchgeführt wird: Konflikte werden nicht linear aufgebaut, und wenn sie in Teilen ausgeführt werden, entstehen weit weniger als 9000 Konflikte. Es war immer noch eine Menge Arbeit, aber nicht so viel, wie es zu einer Zeit zu machen.

Meiner Meinung nach sollte das Rosinenpicken für seltene Situationen reserviert sein, wo es erforderlich ist, zum Beispiel, wenn man direkt an der “Master” -Abzweigung (Stamm, Hauptentwicklungszweig) gearbeitet hat und dann erkannt hat, dass es auch auf ‘maint’ angewendet werden sollte “. Sie sollten den Workflow entweder auf der Zusammenführung oder auf der Rebase (oder “git pull –rebase”) basieren.

Bitte denken Sie daran, dass sich ein ausgewähltes oder rebasiertes Commit vom Standpunkt des Git unterscheidet (hat einen anderen SHA-1-Identifikator) als das Original, also unterscheidet es sich vom Commit im Remote-Repository. (In der Regel kann Rebase 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: so genannte Oktopus-Merge . Beachten Sie, dass Octopus Merge ohne Konflikte erfolgreich sein muss. Trotzdem könnte es nützlich sein.

HTH.

Rebase und Cherry-Pick sind die einzige Möglichkeit, einen sauberen Commit-Verlauf zu behalten. Vermeiden Sie die Zusammenführung und vermeiden Sie die Erstellung von Zusammenführungskonflikten. Wenn Sie Gerrit verwenden, stellen Sie bei Bedarf ein Projekt auf Merge und ein Projekt auf Cherry-Pick-Modus und versuchen Sie es selbst.