Mein Büro möchte, dass eine unendliche Anzahl von Filialen als Richtlinie zusammengelegt wird. Welche anderen Möglichkeiten haben wir?


119

Mein Büro versucht herauszufinden, wie wir mit Zweigaufteilungen und Zusammenschlüssen umgehen, und wir sind auf ein großes Problem gestoßen.

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.

Nun, meiner Meinung nach, besteht die natürliche Art und Weise, damit umzugehen darin, die Seitenzweige zu einem einzigen Commit zusammenzudrücken. mastergeht weiter voran; wie es sollte - wir werfen nicht rückwirkend Monate paralleler Entwicklung in masterdie Geschichte. Und wenn jemand eine bessere Auflösung für die Geschichte des Seitenzweigs braucht, dann ist natürlich alles noch da - es ist einfach nicht masterdrin, es ist im Seitenzweig.

Hier ist das Problem: Ich arbeite ausschließlich mit der Befehlszeile, aber der Rest meines Teams verwendet GUIS. Und ich habe festgestellt, dass das GUIS keine vernünftige Option zum Anzeigen des Verlaufs aus anderen Zweigen bietet . Wenn Sie also ein Squash-Commit erreichen und sagen, "Diese Entwicklung wurde aus dem Zweig gestampft XYZ", ist es ein großer Schmerz, nachzusehen, was drin ist XYZ.

Bei SourceTree bereitet mir das große Kopfzerbrechen: Wenn Sie aktiviert sind und den Verlauf anzeigen mastermöchten master+devFeature, müssen Sie entweder master+devFeaturealle Dateien auschecken (berühren, die unterschiedlich sind) oder Blättern Sie durch ein Protokoll, in dem ALLE Zweigstellen Ihres Repositorys gleichzeitig angezeigt werden, bis Sie den richtigen Ort gefunden haben. Und viel Glück beim Herausfinden, wo Sie sich gerade befinden.

Zu Recht möchten meine Teamkollegen nicht, dass die Entwicklungsgeschichte so unzugänglich ist. Sie wollen also, dass diese großen, langen Entwicklungs-Sidebranches zusammengeführt werden, immer mit einem Merge-Commit. Sie möchten keine Historie, auf die nicht sofort von der Hauptniederlassung aus zugegriffen werden kann.

Ich hasse diese Idee. es bedeutet ein endloses, nicht zu überwindendes Gewirr paralleler Entwicklungsgeschichte. Aber ich sehe nicht, welche Alternative wir haben. Und ich bin ziemlich ratlos. Das scheint fast alles zu blockieren, was ich über gutes Filialmanagement weiß, und es wird für mich eine ständige Enttäuschung, wenn ich keine Lösung finde.

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?


84
Ist das Aufzeichnen einer Zusammenführung als Zusammenführung wirklich so schlimm? Ich kann sehen, dass das Zerquetschen in eine lineare Historie seine Vorteile hat, aber ich bin überrascht, dass dies nicht gegen "fast alles verstößt, was Sie über eine gute Filialverwaltung wissen". Was genau sind die Probleme, vor denen Sie Angst haben?
IMSoP

65
OK, aber in meinem Kopf ein lang andauernden Zweig ist , wo genau Sie tun etwas Sichtbarkeit wollen, so dass die Schuld und bisects landet nicht nur auf „die Änderung als Teil des Big Rewrite von 2016 eingeführt wurde“. Ich bin nicht sicher genug, um eine Antwort zu schreiben, aber mein Instinkt ist, dass es die Aufgaben innerhalb des Feature-Zweigs sind , die unterdrückt werden sollten, damit Sie eine kurze Historie des Projekts haben, auf die Sie von der Haupthistorie aus zugreifen können, ohne dies zu müssen Schauen Sie sich einen verwaisten Zweig an.
IMSoP

5
Davon abgesehen ist es durchaus möglich, dass sich die Frage auf "Ich versuche, Git auf einer höheren Ebene zu verwenden als meine Teamkollegen. Wie halte ich sie davon ab, das für mich durcheinander zu bringen." git log master+bugfixDec10th
Womit ich, fairerweise

26
"Langzeit-Sidebranches - die Art, in der ein paar Leute an einem Sidebranch arbeiten, der sich vom Master trennt, entwickeln wir für ein paar Monate und wenn wir einen Meilenstein erreichen, synchronisieren wir die beiden." Ziehen Sie nicht regelmäßig vom Master in den Nebenast? Wenn Sie dies tun, wird das Leben in vielen Fällen einfacher, wenn sich jeder (wenige) zum Meister verpflichtet.
TafT

4
Ist merge --no-ffwas du willst An mastersich haben Sie einen Commit, der beschreibt, was sich in der Verzweigung geändert hat, aber alle Commits existieren noch und sind HEAD übergeordnet.
CAD97

Antworten:


243

Obwohl ich Git in der Befehlszeile verwende, muss ich mich Ihren Kollegen anschließen. Es ist nicht sinnvoll, große Änderungen in einem einzigen Commit zusammenzufassen. Auf diese Weise verlieren Sie die Geschichte und machen sie nicht nur weniger sichtbar.

Der Punkt der Quellcodeverwaltung besteht darin, den Verlauf aller Änderungen zu verfolgen. Wann hat sich was geändert warum? Zu diesem Zweck enthält jedes Commit Zeiger auf übergeordnete Commits, ein Diff und Metadaten wie eine Commit-Nachricht. Jedes Commit beschreibt den Status des Quellcodes und den vollständigen Verlauf aller Änderungen, die zu diesem Status geführt haben. Der Garbage Collector löscht möglicherweise nicht erreichbare Commits.

Aktionen wie Umbasieren, Kirschpflücken oder Quetschen, Löschen oder Umschreiben des Verlaufs. Insbesondere verweisen die resultierenden Commits nicht mehr auf die ursprünglichen Commits. Bedenken Sie:

  • Sie drücken einige Commits zusammen und vermerken in der Commit-Nachricht, dass der Squash-Verlauf im ursprünglichen Commit abcd123 verfügbar ist.
  • Sie löschen [1] alle Zweige oder Tags, die abcd123 enthalten, da sie zusammengeführt werden.
  • Sie lassen den Müllmann laufen.

[1]: Auf einigen Git-Servern können Zweige vor versehentlichem Löschen geschützt werden, aber ich bezweifle, dass Sie alle Ihre Feature-Zweige für immer behalten möchten.

Jetzt können Sie dieses Commit nicht mehr nachschlagen - es existiert einfach nicht.

Das Referenzieren eines Zweignamens in einer Festschreibungsnachricht ist noch schlimmer, da Zweignamen für ein Repository lokal sind. Was sich master+devFeaturein Ihrer lokalen Kasse befindet, könnte doodlediduhin meiner sein. Bei Zweigen handelt es sich lediglich um verschobene Beschriftungen, die auf ein Commit-Objekt verweisen.

Unter allen Methoden zum Umschreiben von Verlaufsdaten ist das Umbasieren am vorteilhaftesten, da es die vollständigen Festschreibungen mit dem gesamten Verlauf dupliziert und nur eine übergeordnete Festschreibung ersetzt.

Dass die masterHistorie die gesamte Historie aller darin zusammengeführten Branchen umfasst, ist gut so, denn das repräsentiert die Realität. [2] Wenn parallel entwickelt wurde, sollte dies im Protokoll sichtbar sein.

[2]: Aus diesem Grund bevorzuge ich auch explizite Merge-Commits gegenüber linearisierten, aber letztendlich gefälschten Verlaufsdaten, die sich aus einer Neugründung ergeben.

git logVersuchen Sie in der Befehlszeile, den angezeigten Verlauf zu vereinfachen und alle angezeigten Commits relevant zu halten. Sie können die Vereinfachung des Verlaufs an Ihre Bedürfnisse anpassen. Sie könnten versucht sein, ein eigenes Git-Log-Tool zu schreiben, das den Commit-Graphen durchläuft, aber es ist im Allgemeinen unmöglich zu beantworten, ob dieses Commit ursprünglich für diesen oder diesen Zweig festgeschrieben wurde. Das erste übergeordnete Element eines Zusammenführungs-Commits ist das vorherige HEAD, dh das Commit in dem Zweig, in dem Sie zusammenführen. Dies setzt jedoch voraus, dass Sie keine umgekehrte Zusammenführung vom Master zum Feature-Zweig und dann eine schnelle Weiterleitung des Masters zum Merge durchgeführt haben.

Die beste Lösung für langfristige Zweigniederlassungen ist die Vermeidung von Zweigniederlassungen, die erst nach einigen Monaten zusammengeführt werden. Das Zusammenführen ist am einfachsten, wenn die Änderungen kürzlich vorgenommen wurden und gering sind. Im Idealfall werden Sie mindestens einmal pro Woche zusammengeführt. Kontinuierliche Integration (wie bei Extreme Programming, nicht wie bei „Richten wir einen Jenkins-Server ein“) schlägt sogar mehrere Zusammenführungen pro Tag vor, dh keine separaten Feature-Zweige zu verwalten, sondern einen Entwicklungszweig als Team zu teilen. Das Zusammenführen, bevor ein Feature einer Qualitätssicherung unterzogen wird, erfordert, dass das Feature hinter einem Feature-Flag verborgen ist.

Im Gegenzug ermöglicht die häufige Integration, potenzielle Probleme viel früher zu erkennen und eine konsistente Architektur beizubehalten: Weitreichende Änderungen sind möglich, da diese Änderungen schnell in alle Branchen einbezogen werden. Wenn eine Änderung einen Code beschädigt, werden nur ein paar Arbeitstage und nicht ein paar Monate beansprucht.

Das Umschreiben der Geschichte kann für wirklich große Projekte sinnvoll sein, wenn mehrere Millionen Codezeilen und Hunderte oder Tausende von aktiven Entwicklern vorhanden sind. Es ist fraglich, warum ein so großes Projekt ein einzelnes Git-Repo sein müsste, anstatt in separate Bibliotheken aufgeteilt zu werden. In diesem Maßstab ist es jedoch praktischer, wenn das zentrale Repo nur „Releases“ der einzelnen Komponenten enthält. Zum Beispiel verwendet der Linux-Kernel Squashing, um die Hauptgeschichte übersichtlich zu halten. Bei einigen Open Source-Projekten müssen Patches per E-Mail gesendet werden, anstatt sie auf Git-Ebene zusammenzuführen.


43
@Standback Es ist mir egal, was ein Entwickler vor Ort macht. Verwenden Sie "wip" -Erweiterungen, zusätzliche Ersetzungen für jeden festen Tippfehler. Das ist in Ordnung, es ist besser, zu oft zu verpflichten. Im Idealfall bereinigt der Entwickler diese Commits, bevor sie übertragen werden, indem er beispielsweise alle Commits kombiniert, mit denen nur einige Tippfehler behoben werden. Es ist immer noch eine gute Idee, Commits getrennt zu halten, wenn sie unterschiedliche Aufgaben ausführen, z. B. ein Commit für die tatsächliche Funktionalität und zugehörige Tests, ein anderes für nicht verwandte Tippfehler. Aber sobald die Commits gepusht sind, ist das Umschreiben oder Löschen des Verlaufs mehr Mühe als es wert ist, zumindest nach meiner Erfahrung.
amon

11
"Es ist im Allgemeinen unmöglich zu beantworten, ob dieses Commit ursprünglich für diese oder jene Branche festgelegt wurde." Ich möchte wirklich in der Lage sein, mein Versionskontrollsystem zu fragen, "was war in Zweig x am Datum y"
Peter Green

80
Nichts ist frustrierender als der Versuch, die Ursache eines Fehlers im Code mithilfe von zu identifizieren git bisect, damit er über ein Uber-Commit von 10.000 Zeilen aus einem Nebenzweig ermittelt wird.
tpg2114

2
@ Standback IMHO je kleiner das Commit ist, desto lesbarer und freundlicher ist es. Ein Commit, das mehr als nur wenige Punkte berührt, ist auf den ersten Blick nicht zu fassen. Nehmen Sie die Beschreibung daher zum Nennwert. Das ist die Lesbarkeit der Beschreibung (zB "implementiertes Feature X"), nicht das Commit (Code) selbst. Ich hätte lieber 1000 Ein-Buchstaben-Commits wie "http zu https geändert"
:)

2
cherry-pick überschreibt oder löscht den Verlauf nicht. Es werden nur neue Commits erstellt, die Änderungen von vorhandenen Commits replizieren
Sarge Borsch,

110

Die Antwort von Amon gefällt mir , aber ich war der Meinung, dass ein kleiner Teil viel wichtiger ist: Sie können den Verlauf beim Anzeigen von Protokollen leicht vereinfachen, um Ihre Anforderungen zu erfüllen, aber andere können den Verlauf beim Anzeigen von Protokollen nicht hinzufügen, um ihre Anforderungen zu erfüllen. Aus diesem Grund ist es vorzuziehen, die Historie so zu belassen, wie sie aufgetreten ist.

Hier ist ein Beispiel aus einem unserer Repositories. Wir verwenden ein Pull-Request-Modell, sodass jede Funktion Ihren langjährigen Filialen im Verlauf ähnelt, auch wenn sie normalerweise nur eine Woche oder weniger ausgeführt werden. Einzelne Entwickler entscheiden sich manchmal dafür, ihre Historie vor dem Zusammenführen zu zerquetschen, aber wir stimmen häufig mit Funktionen überein, was relativ ungewöhnlich ist. Hier sind die Top-Commits gitk, die mit Git ausgelieferte GUI:

Standard Gitk Ansicht

Ja, ein bisschen durcheinander, aber wir mögen es auch, weil wir genau sehen können, wer zu welcher Zeit welche Änderungen hatte. Es spiegelt genau unsere Entwicklungsgeschichte wider. Wenn wir eine übergeordnete Ansicht anzeigen möchten, die jeweils nur eine Pull-Anforderung enthält, können wir uns die folgende Ansicht ansehen, die dem git log --first-parentBefehl entspricht:

Gitk-Ansicht mit --first-parent

git logbietet viele weitere Optionen, mit denen Sie genau die gewünschten Ansichten erhalten. gitkkann ein beliebiges git logArgument verwenden, um eine grafische Ansicht zu erstellen. Ich bin sicher, dass andere GUIs ähnliche Funktionen haben. Lesen Sie die Dokumente und lernen Sie, wie Sie sie richtig verwenden, anstatt Ihre bevorzugte git logAnsicht für alle Benutzer zum Zeitpunkt der Zusammenführung zu erzwingen .


24
Ich war mit dieser Option nicht vertraut! Dies ist eine enorme Hilfe für mich und es klingt so, als ob ich durch das Erlernen weiterer Protokolloptionen leichter damit leben kann.
Standback

25
+1 für "Sie können den Verlauf beim Anzeigen von Protokollen einfach vereinfachen, um Ihre Anforderungen zu erfüllen, aber andere können den Verlauf beim Anzeigen von Protokollen nicht hinzufügen, um ihre Anforderungen zu erfüllen." Das Umschreiben von Geschichte ist immer fragwürdig. Wenn Sie es für wichtig hielten, zum Zeitpunkt des Commits aufzuzeichnen, war es wichtig. Auch wenn Sie festgestellt haben, dass es falsch war oder es später noch einmal gemacht hat, ist dies Teil der Geschichte. Einige Fehler machen nur dann Sinn, wenn man daran schuld ist, dass diese eine Zeile von einem späteren Umschreiben übrig geblieben ist. Wenn Fehler mit dem Rest des Epos verbunden sind, können Sie nicht nachvollziehen, warum die Dinge so endeten, wie sie waren.
TafT

@ Standback Related, eine Sache, die mir dabei hilft, diese Struktur beizubehalten, ist die Verwendung von merge --no-ff- verwende keine Schnellvorlauf-Zusammenführungen, sondern erstelle immer ein Zusammenführungs-Commit, damit --first-parentetwas funktioniert
Izkata

34

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.

Mein erster Gedanke ist - mach das nicht einmal, es sei denn, es ist absolut notwendig. Ihre Zusammenführungen müssen manchmal schwierig sein. Halten Sie Niederlassungen unabhängig und so kurzlebig wie möglich. Dies ist ein Zeichen dafür, dass Sie Ihre Storys in kleinere Implementierungsteile aufteilen müssen.

In dem Fall, dass Sie dies tun müssen, ist es möglich, git mit der Option --no-ff zusammenzuführen, so dass die Historien auf ihrem eigenen Zweig getrennt bleiben. Die Commits werden weiterhin im zusammengeführten Verlauf angezeigt, können jedoch auch separat im Feature-Zweig angezeigt werden, sodass zumindest festgestellt werden kann, zu welcher Entwicklungslinie sie gehörten.

Ich muss zugeben, als ich anfing, git zu verwenden, fand ich es etwas seltsam, dass die Branch-Commits nach dem Zusammenführen in derselben Historie wie der Haupt-Branch erschienen sind. Es war ein wenig beunruhigend, weil es nicht so schien, als gehörten diese Verpflichtungen in diese Geschichte. Aber in der Praxis ist das überhaupt nicht schmerzhaft, wenn man bedenkt, dass der Integrationszweig genau das ist - sein ganzer Zweck ist es, die Feature-Zweige zu kombinieren. In unserem Team werden wir nicht gequetscht, und wir führen häufig Merge-Commits durch. Wir verwenden --no-ff die ganze Zeit, um sicherzustellen, dass die genaue Historie eines Features leicht zu sehen ist, falls wir es untersuchen möchten.


3
Ich bin völlig einverstanden. alle viel lieber in der nähe des meisters bleiben. Aber das ist ein anderes Thema, das viel größer und weit weniger unter meinem eigenen bescheidenen Einfluss ist :-P
Standback

2
+1 fürgit merge --no-ff
0xcaff

1
Auch +1 für git merge --no-ff. Wenn Sie gitflow verwenden, wird dies zur Standardeinstellung.
David Hammen

10

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 masterder 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 rebaseist 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 masterKopf und dem Zweigkopf zum Zeitpunkt des Zusammenschlusses.

Stellen Sie sicher, dass Sie die --no-ffOption angeben . Das Zusammenführen ohne --no-ffsollte in Ihrem Szenario strengstens untersagt sein. Leider --no-ffist das nicht die Standardeinstellung; aber ich glaube, es gibt eine Option, die Sie einstellen können, die es so macht. Sehen Sie, git help mergewas --no-fftut (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-ffbegehen.

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 guieinmal. 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. gitbaut 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-ffMerge-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 Bist genau das gleiche wie mit git checkout B ; git merge AAusnahme kleinerer visuellen Unterschiede wie die Zweige um in getauscht werden git logetc.).

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 mastermit einem umfangreichen Verlauf, der alle Feature- Festschreibungszeilen enthält, die es je gab. Dabei wurde auf die git initFestschreibung 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 gitAnsatz 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 gitjeden 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.


10

Wenn Sie einen langfristigen Seitenzweig zerquetschen, verlieren Sie viele Informationen.

Was ich tun würde, ist zu versuchen, den Master in den langfristigen Nebenzweig zurückzugliedern, bevor der Nebenzweig in den Master zusammengeführt wird . Auf diese Weise behalten Sie jedes Commit im Master bei, während der Commit-Verlauf linear und verständlicher wird.

Wenn ich das bei jedem Commit nicht so einfach machen könnte, würde ich es nicht linear sein lassen , um den Entwicklungskontext klar zu halten. Meiner Meinung nach hatte die Nichtlinearität eine reale Bedeutung, wenn ich während des Zurücksetzens des Masters in die Sidebranche ein Problem hatte. Das heißt, es wird einfacher zu verstehen sein, was passiert ist, falls ich in die Geschichte eintauchen muss. Ich habe auch den unmittelbaren Vorteil, dass ich keinen Rebase machen muss.


: + zum Erwähnen rebase. Unabhängig davon, ob es der beste Ansatz ist oder nicht (ich persönlich habe noch keine großartigen Erfahrungen damit gemacht, obwohl ich ihn nicht viel genutzt habe), scheint er definitiv dem am nächsten zu sein, was OP wirklich zu wollen scheint - insbesondere a Kompromiss zwischen einem Speicherauszug für einen nicht in Ordnung befindlichen Verlauf und dem vollständigen Ausblenden dieses Verlaufs.
Kyle Strand

1

Persönlich bevorzuge ich es, meine Entwicklung in einer Abzweigung durchzuführen und dann Anforderungen zum Zusammenführen in das primäre Repository abzurufen.

Das heißt, wenn ich meine Änderungen auf Master zurücksetzen oder einige WIP-Commits quetschen möchte, kann ich das voll und ganz tun. Oder ich kann nur verlangen, dass meine gesamte Geschichte mit einbezogen wird.

Was ich gerne mache, ist meine Entwicklung auf einem Zweig, aber häufig gegen Master / Dev. Auf diese Weise erhalte ich die neuesten Änderungen vom Master, ohne dass eine Reihe von Merge-Commits in meinem Zweig vorhanden sind oder eine ganze Menge von Merge-Konflikten auftreten müssen, wenn es Zeit ist, zum Master zusammenzuführen.

So beantworten Sie Ihre Frage explizit:

Haben wir hier eine andere Möglichkeit, als Sidebranches ständig mit Merge-Commits zum Master zusammenzuführen?

Ja - Sie können sie einmal pro Zweig zusammenführen (wenn das Feature oder der Fix "vollständig" ist) oder wenn Sie die Zusammenführungs-Commits nicht in Ihrem Verlauf haben möchten, können Sie nach einer letzten Rebase einfach einen Schnellvorlauf für den Master durchführen.


3
Es tut mir leid - ich mache dasselbe, aber ich verstehe nicht, wie dies die Frage beantwortet: - /
Standback

2
Es wurde eine explizite Antwort auf Ihre angegebene Frage hinzugefügt.
Wayne Werner

Das ist in Ordnung für meine eigenen Verpflichtungen, aber ich (und mein Team) werden uns um die Arbeit aller kümmern . Es ist einfach, meine eigene Geschichte sauber zu halten. Die Arbeit in einer chaotischen Entwicklungsgeschichte ist hier das Problem.
Standback

Sie meinen, Sie möchten von anderen Entwicklern verlangen, dass sie ... was? Nicht rebase und nur beim Zusammenführen squashen? Oder haben Sie diese Frage nur gestellt, um sich über die mangelnde Disziplin Ihrer Kollegen zu beschweren?
Wayne Werner

1
Ein regelmäßiges erneutes Basieren ist nicht sinnvoll, wenn mehrere Entwickler an diesem Feature-Zweig arbeiten.
Paŭlo Ebermann

-1

Revisionskontrolle ist Garbage-In Garbage-Out.

Das Problem ist, dass die in Bearbeitung befindlichen Arbeiten im Feature-Zweig eine Menge enthalten können: "Lass es uns versuchen ... nein, das hat nicht funktioniert, lass es uns durch das ersetzen." die Geschichte nutzlos zu verschmutzen.

Letztendlich sollte der Verlauf beibehalten werden (ein Teil davon könnte in Zukunft von Nutzen sein), aber nur eine "saubere Kopie" sollte zusammengeführt werden.

Bei Git können Sie dazu zuerst den Feature-Zweig verzweigen (um den gesamten Verlauf zu erhalten), dann den Zweig des Feature-Zweigs vom Master aus (interaktiv) umbasieren und dann den umbasierten Zweig zusammenführen.


1
Um es zu verdeutlichen: Sie wollen den Verlauf des Feature-Zweigs neu schreiben (eine Kopie davon), sodass ein kurzer, übersichtlicher Verlauf entsteht, bei dem das ganze Hin und Her der anfänglichen Entwicklung entfällt. Und dann ist das Zusammenführen des umgeschriebenen Zweigs in master einfacher und sauberer. Habe ich dich richtig verstanden?
Standback

1
Ja. Und wenn Sie sich mit dem Master verbinden, geht es nur schnell vorwärts (vorausgesetzt, Sie haben vor dem Zusammenführen vor kurzem eine neue Basis eingerichtet).
DepressedDaniel

Aber wie wird diese Geschichte dann aufbewahrt? Lässt du den ursprünglichen Feature-Zweig herumliegen?
Paŭlo Ebermann

@ PaŭloEbermann Bingo.
DepressedDaniel

Nun, wie jemand anderes in einem Kommentar sagte: Zweige sind nur Zeiger in der Verlaufsgrafik gitund sie sind lokal. Was fooin einem Repo benannt ist, kann barin einem anderen Repo benannt sein . Und sie sollen nur vorübergehend sein: Sie möchten Ihr Repo nicht mit Tausenden von Feature-Zweigen überfrachten, die am Leben gehalten werden müssen, um zu vermeiden, dass die Historie verloren geht. Und Sie müssten diese Zweige behalten, um den Verlauf der Referenz beizubehalten, denn gitschließlich werden alle Festschreibungen gelöscht, die für einen Zweig nicht mehr erreichbar sind.
cmaster
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.