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".
Antworten:
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.
quelle
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.
quelle
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).
quelle
git rebase -i
Sie dies einfach und selektiv tun können. Das nächste Mercurial-Äquivalent ist histedit .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
, undgit apply
weit häufiger in dieser Rolle alsgit add
odergit commit
. Tools wierebase
ermö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 problem
oderRefactored <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: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.
quelle
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.
quelle
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.
quelle