Ist die Versionsgeschichte wirklich heilig oder ist es besser, sie zu rebasieren?

26

Ich habe mich jedoch immer mit Mercurials Mantra 1 einverstanden erklärt , da Mercurial jetzt mit der Rebase-Erweiterung geliefert wird und es eine beliebte Praxis in Git ist. Ich frage mich, ob es wirklich als "schlechte Praxis" angesehen werden kann oder zumindest schlimm genug, um die Verwendung zu vermeiden. Auf jeden Fall bin ich mir bewusst, dass das Umbasieren nach dem Schieben gefährlich ist.

OTOH, ich sehe den Sinn darin, 5 Commits in einem einzigen zu verpacken, um es raffinierter aussehen zu lassen (insbesondere in einer Produktionsbranche). Persönlich denke ich jedoch, wäre es besser, wenn man in der Lage wäre, teilweise Commits für ein Feature zu sehen, bei dem es einige gibt Experimentieren wird gemacht, auch wenn es nicht so geschickt ist, aber wenn man so etwas wie "Versucht es so zu machen, wie X, aber es ist nicht so optimal wie Y, wenn man es macht, wenn man Y als Basis nimmt", hätte IMHO einen guten Wert für die Studierenden die Codebasis und folgen Sie dem Gedankengang der Entwickler.

Ich bin der Meinung, dass Programmierer gerne Fehler verbergen ... und ich denke, dass dies überhaupt nicht gut für das Projekt ist.

Meine Frage lautet also: Haben Sie es wirklich für wertvoll befunden, solche "organischen Commits" (dh unverfälschte Geschichte) in der Praxis zu haben? Oder ziehen Sie es umgekehrt vor, auf raffinierte, gut verpackte Commits zu stoßen und den Experimentierprozess der Programmierer zu ignorieren? Für wen auch immer Sie sich entschieden haben, warum funktioniert das für Sie? (mit anderen Teammitgliedern, um die Geschichte zu führen, oder alternativ, um sie neu zu gründen).


1 pro Google DVCS-Analyse in Mercurial "Geschichte ist heilig".

dukeofgaming
quelle
Können Sie einen Verweis darauf geben, wo es als "Mercurials Mantra" angegeben ist?
gnat
Nun, da Sie es erwähnen, denke ich, dass es tatsächlich von Googles DVCS- Analysecode stammt. Google.com/p/support/wiki/DVCSAnalysis (aber die Tatsache bleibt)
dukeofgaming

Antworten:

22

Die Geschichte ist heilig, die Gegenwart nicht. Sie können Ihren DVCS-"Baum" in zwei Teile teilen:

  • Die Vergangenheit / Historie, die eine genaue Ansicht darüber enthält, wie Sie den aktuellen Status des Codes erreicht haben. Dieser Teil der Geschichte wächst mit der Zeit

  • Die Gegenwart, an welchem ​​Teil Sie gerade arbeiten, um Ihren Code zu entwickeln. Dieser Tipp hat den größten Teil der Geschichte etwa immer die gleiche Größe.

Jeder Code, den Sie veröffentlicht oder auf irgendeine Weise verwendet haben, gehört der Vergangenheit an . Die Vergangenheit ist heilig, weil Sie in der Lage sein müssen, ein Setup zu reproduzieren oder zu verstehen, was eine Regression eingeleitet hat. Du sollst niemals die Vergangenheit umschreiben . In git schreibt man normalerweise nie etwas um, wenn es einmal in master ist: master ist der letzte Teil der Geschichte. In Mercurial haben Sie dieses Konzept der öffentlichen Phase , das den letzten Teil Ihres "Baums" verfolgt und dessen Unveränderlichkeit erzwingt.

Der vorliegende Teil des Codes ist der Änderungssatz, an dem Sie gerade arbeiten. Der Feature-Zweig, den Sie verwenden möchten, fehlerfrei und ordnungsgemäß überarbeitet. Es ist vollkommen in Ordnung, es umzuschreiben, es ist sogar eine gute Idee, weil es den letzten Teil hübscher, einfacher und benutzerfreundlicher macht. Mercurial verfolgt dies in der Entwurfsphase .

Also ja, bitte versuchen Sie es erneut, wenn es Ihre Geschichte verbessert. Mercurial wird Sie daran hindern, sich in den Fuß zu schießen, wenn Sie Sachen umbauen, die Sie nicht sollten.

Marmoute
quelle
Jetzt gefiel mir deine Antwort besser
dukeofgaming
7

Nicht alle Fehler sind von der Art, die Sie verbergen müssen - zum Beispiel habe ich einmal versehentlich eine Binärdatei in mein Repo geschrieben. Manipulationen an der Historie sind nur dann schlimm, wenn der Fehler nicht ausschließlich in der Historie selbst liegt, wie zum Beispiel festgeschriebene Dateien, die nicht festgeschrieben werden sollten.

DeadMG
quelle
1
Du würdest dich also niemals zurücklehnen, um ein Commit "logischer" zu machen?
Dukeofgaming
7

Die Codeüberprüfung ist viel einfacher, wenn es eine große zusammenhängende Änderung gibt, im Gegensatz zu vielen kleinen abhängigen Änderungen.

Wenn ich an einem neuen Feature arbeite, möchte ich viele kleine Änderungen in meiner Branche vornehmen. Wenn ich bereit bin, den Patch einzureichen, reduziere ich diese kleinen Commits zu einem großen Commit, das den gesamten neuen Code darstellt, der für diese Funktion erforderlich ist. Hier bietet sich Rebase an.

Andererseits ist Rebase schlecht beraten, wenn die Commits nichts miteinander zu tun haben. Mehrere Feature-Ergänzungen sollten separate Commits sein (und im Idealfall aus separaten Zweigen stammen).

Chrisaycock
quelle
4
Es gibt viele Tools, mit denen die Codeüberprüfung mehrerer verwandter Änderungen ziemlich trivial ist. Ich kaufe dies also nicht als Antwort
jk.
4
Worin besteht ein Unterschied zwischen der Überprüfung des Unterschieds zwischen der Basisversion und der vollständigen Überarbeitung des Features und der Überprüfung des einzelnen Commits dieser neu basierten Commit-Gruppe? Es wird identisch aussehen, wenn die Basisstation ihren Job richtig gemacht hat!
Mark Booth
3
Was Sie hier beschreiben, widerspricht direkt den Ratschlägen im Mercurial-Wiki . Kleine "offensichtlich richtige" Änderungssätze werden für Überprüfungen bevorzugt. Es ist in Mercurial nicht normal, einen Feature-Zweig in einen einzigen Änderungssatz zu bündeln. Ich habe gesehen, dass es in Git viel häufiger empfohlen wird, wenn git rebase -iSie dies einfach und selektiv tun können. Das nächste Mercurial-Äquivalent ist histedit .
Martin Geisler
9
Ich stimme überhaupt nicht zu. In den letzten Jahren haben wir ein Tool für Codeüberprüfungen verwendet, und es gab nichts, was ich mehr hasste, wenn ein Änderungssatz mit über 30 Dateien zur Überprüfung eingereicht wurde. Es ist viel einfacher, viele kleine Änderungen zu bekommen. Ich habe diese Klasse zB in xyz umbenannt, weil sie die geänderte Verantwortung besser widerspiegelt. Ich habe die Methode nn hinzugefügt, weil ich sie für blah brauche. Viel einfacher mit kleineren Reviews umzugehen.
Pete
3
Ich habe diese Idee in der GIT-Community schon oft gehört, viele Commits zu einem zusammenzufassen, bevor Sie zum offiziellen Repo stoßen, aber das hat mir nie geholfen. Ich hätte lieber die kleinen Verpflichtungen mit aussagekräftigen Nachrichten. Wie andere angemerkt haben, können Sie einen Vergleich über mehrere Änderungssätze durchführen.
Chris Sutton
4

Ihre Frage beschreibt den Verlauf als eine Reihe von geordneten Codeänderungen und fragt, ob organische Commits zukünftige Leser in den Entwicklungsprozess einbeziehen. Als Release- / Integrationstechniker stelle ich mir Geschichte jedoch nicht oft als Code vor. Ich bin mehr in die Geschichte vertieft, die meine Geschichte erzählt, das institutionelle Wissen, das es bewahrt, und ob es mir erlaubt, Probleme schnell zu beheben oder nicht.

Ich glaube nicht, dass organische Workflows so gut funktionieren, auch nicht meine eigenen. Qualitäten, die ich beim Codieren von DVCS schätze - günstige Filialen, schnelle Festschreibungen, frühzeitiges Speichern auf der Fernbedienung und oft - sind nicht das, was ich als Integrationsmanager meines Unternehmens schätze . Ich Frage git rebase, git merge, git diff, und git applyweit häufiger in dieser Rolle als git addoder git commit. Tools wie rebaseermöglichen es mir, den mir gegebenen Code von etwas, das funktioniert, in etwas zu verwandeln, das gewartet werden kann.

Unlogische oder vage Verpflichtungserklärungen sind nicht nützlich, aber sündhaft einfach organisch zu schreiben, wenn das Hauptanliegen darin besteht, den Code zum Laufen zu bringen und nicht an andere weiterzugeben. Commits mögen Case 15: Fixed a problemoder Refactored <cranky legacy feature>machen meine Wartung selbst erschütternd, auch wenn ich sie verfasse. Keine jedoch induziert die Blackout-Wut wie "inkrementelle" Commits. Betrachten Sie diese Zweigstelle, die mir neulich ein Entwickler gegeben hat:

$ git log production..topic --oneline
f9a1184 incremental update
156d299 incremental commits
e8d50b0 new incremental updates
511c18c incremental updates, refactor
1b46217 incremental upgrade
9e2b3b8 incremental update
fa68a87 incremental update

Diese Dinge sind böse. Es ist wie für Dr. Faustus entwickeltes DVCS. Ich gebe Ihnen eine schnelle und einfache Quellcodeverwaltung. Sie geben mir die Seele Ihres Code-Betreuers. Alle faulen Handlungen sind egoistische Handlungen. Viele von uns schreiben sie, aber wir schulden uns auch eine logische, reproduzierbare und debugfähige Geschichte. Wir können das nicht ohne eine Möglichkeit tun rebase.

Warum beschreiben Sie die fehlgeschlagenen Experimente nicht in unseren (unberührten) Commit-Nachrichten? In einem Jahr brauche ich kein halbfertiges Snippet. Ich möchte nur eine Aufzeichnung des abgebrochenen Versuchs und vielleicht eine kurze Erklärung, wenn ich der Meinung bin, dass ich dumm genug bin, es erneut zu versuchen. Es gibt viele erfolgreiche Workflows auf der Welt, aber ich habe Mühe, mir einen Grund zu überlegen, warum ich wissentlich fehlerhaften Code in eine Produktionscodebasis geschrieben habe.

Christopher
quelle
Sehr nette Antwort, glasklare Motivation, warum man zurückweist
dukeofgaming
2

Nichts sollte heilig sein, aber stellen Sie sicher, dass Sie gute Gründe für das haben, was Sie tun. Wie bei jedem leistungsfähigen Werkzeug kann auch das Wiederherstellen bei ordnungsgemäßer Verwendung verwirrend sein und Probleme verursachen, wenn es unachtsam verwendet wird.

Persönlich finde ich es sehr nützlich, einen lokalen Feature-Zweig gegen Trunk (oder Hauptentwicklungszweig) zu rebasieren, bevor die abschließenden Tests ausgeführt und das Feature in den Hauptzweig eingebunden werden. Auf diese Weise kann ich mich mit Zusammenführungskonflikten usw. befassen, bevor ich sie tatsächlich zusammenführe.

harald
quelle
1

Nach meinem Dafürhalten gehören Experimente normalerweise zu Regalen oder temporären Zweigen, nicht zu Basislinien. Wenn Sie dies befolgen, sollte es kein Problem geben, da alle Festschreibungen logisch fundiert sind und einen Mehrwert bieten.

Coder
quelle
Was Sie damit sagen, ist, dass Sie Arbeitszweige der Bearbeitung eines Basiszweigs vorziehen (z. B. Master / Standard, Produktion / Release, vX.X usw.)?
Dukeofgaming