Lassen Sie mich Ihre Punkte direkt und klar beantworten:
Wir haben es mit langfristigen Nebenzweigen zu tun - bei denen ein paar Leute an einem Nebenzweig arbeiten, der sich vom Meister trennt, den wir für ein paar Monate entwickeln, und wenn wir einen Meilenstein erreichen, synchronisieren wir die beiden.
Normalerweise möchten Sie Ihre Filialen nicht monatelang nicht synchronisieren lassen.
Ihr Feature-Zweig hat sich abhängig von Ihrem Workflow von etwas verzweigt. Nennen wir es master
der Einfachheit halber einfach. Wann immer Sie sich zum Meister verpflichten, können und sollten Sie es jetzt tun git checkout long_running_feature ; git rebase master
. Dies bedeutet, dass Ihre Niederlassungen von Entwurf immer synchron sind.
git rebase
ist auch hier das richtige. Es ist kein Hack oder etwas Seltsames oder Gefährliches, sondern ganz natürlich. Sie verlieren eine Information, nämlich den "Geburtstag" des Feature-Zweigs, aber das war's. Wenn jemand dies für wichtig hält, kann es bereitgestellt werden, indem es an einer anderen Stelle gespeichert wird (in Ihrem Ticketsystem oder, wenn die Notwendigkeit groß ist, in einem git tag
...).
Nun, meiner Meinung nach, ist die natürliche Art, damit umzugehen, die Seitenzweige zu einem einzigen Commit zusammenzudrücken.
Nein, das wollen Sie absolut nicht, Sie wollen ein Merge-Commit. Ein Merge-Commit ist auch ein "Single-Commit". Es werden nicht alle einzelnen Branch Commits "in" master eingefügt. Es handelt sich um ein einzelnes Commit mit zwei Elternteilen - dem master
Kopf und dem Zweigkopf zum Zeitpunkt des Zusammenschlusses.
Stellen Sie sicher, dass Sie die --no-ff
Option angeben . Das Zusammenführen ohne --no-ff
sollte in Ihrem Szenario strengstens untersagt sein. Leider --no-ff
ist das nicht die Standardeinstellung; aber ich glaube, es gibt eine Option, die Sie einstellen können, die es so macht. Sehen Sie, git help merge
was --no-ff
tut (kurz: es aktiviert das Verhalten, das ich im vorherigen Absatz beschrieben habe), es ist entscheidend.
wir werfen nicht rückwirkend Monate paralleler Entwicklung in die Geschichte des Meisters.
Absolut nicht - Sie werfen niemals etwas "in die Geschichte" einer Branche, insbesondere nicht mit einem Merge-Commit.
Und wenn jemand eine bessere Lösung für die Geschichte des Nebenzweigs braucht, dann ist natürlich alles noch da - es ist nur nicht im Master, es ist im Nebenzweig.
Bei einem Merge-Commit ist es immer noch da. Nicht im Master, sondern im Sidebranch, klar erkennbar als eines der Elternteile des Merge Commits und für die Ewigkeit erhalten, wie es sein sollte.
Sehen Sie, was ich getan habe? Alle Dinge , die Sie für Ihre Squash beschreiben begehen , sind genau dort mit der Zusammenführung --no-ff
begehen.
Hier ist das Problem: Ich arbeite ausschließlich mit der Befehlszeile, aber der Rest meines Teams verwendet GUIS.
(Nebenbemerkung: Ich arbeite fast ausschließlich auch mit der Befehlszeile. (Nun, das ist eine Lüge. Ich verwende normalerweise Emacs Magit. Aber das ist eine andere Geschichte. Wenn ich mit meinem individuellen Emacs-Setup nicht an einem geeigneten Ort bin, bevorzuge ich den Befehl Linie als auch). Aber bitte selbst einen gefallen tun und zumindest versuchen , git gui
einmal. Es ist so viel effizienter für die Kommissionierung Linien, große stücke usw. für das Hinzufügen / Verhängnis hinzufügt.)
Und ich habe festgestellt, dass das GUIS keine vernünftige Option zum Anzeigen des Verlaufs aus anderen Zweigen bietet.
Das ist so, weil das, was du versuchst, total gegen den Geist von ist git
. git
baut vom Kern auf einem "gerichteten azyklischen Graphen" auf, was bedeutet, dass sich viele Informationen in der Eltern-Kind-Beziehung von Commits befinden. Bei Zusammenführungen bedeutet dies, dass zwei Elternteile und ein Kind tatsächlich zusammengeführt werden. Die GUIs Ihrer Kollegen werden in Ordnung sein, sobald Sie no-ff
Merge-Commits verwenden.
Wenn Sie also ein Squash-Commit erreichen und sagen, dass "diese Entwicklung aus Zweig XYZ gestrichen wurde", ist es sehr mühsam zu sehen, was in XYZ enthalten ist.
Ja, aber das ist kein Problem der Benutzeroberfläche, sondern des Squash-Commits. Wenn Sie einen Squash verwenden, lässt der Kopf des Feature-Zweigs hängen und es wird ein ganz neues Commit erstellt master
. Dies bricht die Struktur auf zwei Ebenen und schafft ein großes Durcheinander.
Sie wollen also, dass diese großen, langen Entwicklungs-Sidebranches zusammengeführt werden, immer mit einem Merge-Commit.
Und sie haben absolut recht. Aber sie nicht „verschmolzen sind in “, werden sie verschmolzen gerade. Eine Zusammenführung ist eine wirklich ausgewogene Sache, es hat keine bevorzugte Seite , die „in“ der anderen verschmolzen wird ( git checkout A ; git merge B
ist genau das gleiche wie mit git checkout B ; git merge A
Ausnahme kleinerer visuellen Unterschiede wie die Zweige um in getauscht werden git log
etc.).
Sie möchten keine Historie, auf die nicht sofort von der Hauptniederlassung aus zugegriffen werden kann.
Welches ist völlig richtig. Zu einer Zeit, in der es keine nicht zusammengeführten Features gibt, gibt es einen einzelnen Zweig master
mit einem umfangreichen Verlauf, der alle Feature- Festschreibungszeilen enthält, die es je gab. Dabei wurde auf die git init
Festschreibung von Anfang an zurückgegriffen. Verzweigungen "im letzten Teil dieses Absatzes, da der Verlauf zu diesem Zeitpunkt nicht mehr" Verzweigungen "ist, obwohl das Festschreibungsdiagramm ziemlich verzweigt wäre).
Ich hasse diese Idee.
Dann haben Sie ein bisschen Schmerzen, da Sie gegen das von Ihnen verwendete Werkzeug arbeiten. Der git
Ansatz ist sehr elegant und kraftvoll, insbesondere im Bereich der Verzweigung / Zusammenführung. Wenn Sie es richtig machen (wie oben angedeutet, insbesondere mit --no-ff
), ist es sprunghaft besser als andere Ansätze (z. B. das Subversion-Chaos, parallele Verzeichnisstrukturen für Zweige zu haben).
es bedeutet ein endloses, nicht zu überwindendes Gewirr paralleler Entwicklungsgeschichte.
Endlos, parallel - ja.
Unnavigable, Tangle - nein.
Aber ich sehe nicht, welche Alternative wir haben.
Warum nicht git
jeden Tag so arbeiten wie der Erfinder von , Ihre Kollegen und der Rest der Welt?
Haben wir hier eine andere Möglichkeit, als Sidebranches ständig mit Merge-Commits zum Master zusammenzuführen? Oder gibt es einen Grund, warum es nicht so schlimm ist, ständig Merge-Commits zu verwenden, wie ich befürchte?
Keine anderen Optionen; nicht so schlimm.