Wann soll Code festgeschrieben werden?

59

Bei der Arbeit an einem Projekt kann der Code über einen längeren Zeitraum von einigen Wochen / Monaten / Jahren in einem einzigen Tag oder Stück für Stück relativ schnell entwickelt werden. Da Code-Commits immer mehr als Maß für die Projektentwicklung angesehen werden, bedeutet dies nicht, dass mehr Code geschrieben wurde als in einem Projekt mit geringeren Commits.

Die Frage ist also, wann wirklich ein Commit für das Repository durchgeführt werden muss, damit das Commit gerechtfertigt ist.

Als Add-On: Ist es richtig, die Entwicklung eines Projekts anhand seiner Commits zu messen?

Mücke
quelle
9
Die meisten Dinge, die leicht zu quantifizieren sind, sind schlechte Metriken, weil sie zu stark vereinfacht sind oder leicht zu spielen sind, um eine gute Leistung gegenüber der spezifischen Messung zu erzielen.
Unholysampler
Vielen Dank für die Beiträge. Es gibt viele triftige Gründe für ein Commit, das auf die Antworten verteilt ist. Ich kann keine Mehrfachantworten akzeptieren. Ich akzeptiere die Antwort mit den höchsten Stimmen bis jetzt. Aber ich nehme alle Ihre Antworten auf.

Antworten:

79

Sie schreiben fest, wenn Sie einen Codebasisstatus erreicht haben, an den Sie sich erinnern möchten. Es gibt viele Gründe, warum Sie sich an einen bestimmten Codebasisstatus erinnern möchten. Daher kann es keine festen Regeln für den Zeitpunkt des Commits geben. Die Anzahl der Commits ist jedoch definitiv kein Maß für Qualität oder Fortschritt.

Neil Butterworth
quelle
10
Ich stimme dem Nachtrag zu, dass der Kofferraum eine andere Geschichte ist. Um zum Beispiel in den Kofferraum meines Teams einzuchecken, muss es a) korrekt bauen und b) etwas vervollständigen. Es steht jedoch jedem Teammitglied frei, einen Zweig zu erstellen, und er kann sich in einem beliebigen Status befinden.
Edward Strange
34

Coding stelle ich mir in diesem Zusammenhang gerne als Klettern vor. Sie klettern ein Stück und setzen dann einen Anker in den Felsen. Sollten Sie jemals fallen, ist der letzte Anker, den Sie gepflanzt haben, der Punkt, der Sie sichert, sodass Sie nie mehr als ein paar Meter fallen. Gleiches gilt für die Quellcodeverwaltung. Sie codieren ein wenig und wenn Sie eine etwas stabile Position erreichen, legen Sie eine Revision fest. Sollten Sie jemals schrecklich scheitern, können Sie immer zu dieser letzten Revision zurückkehren und Sie wissen, dass sie stabil ist.

Das heißt, wenn Sie in einem Team arbeiten, ist es üblich, sicherzustellen, dass alles, was Sie festschreiben, vollständig, sinnvoll, sauber und ohne Probleme für andere ist. Wenn Sie größere Änderungen vornehmen müssen, die die Arbeit anderer Personen beeinträchtigen könnten, erstellen Sie einen Zweig, damit Sie einen Commit durchführen können, ohne andere zu stören.

Dies hängt auch vom verwendeten SCM-System ab. Bei verteilten Systemen ist das Zusammenführen und Verzweigen in der Regel schmerzlos und schnell, und Sie können ein lokales Commit durchführen. Dies bedeutet, dass Sie viel tun sollten, und Push / Merge, wenn Sie eine erhebliche Menge an Arbeit erledigt haben. Mit zentralisierten Systemen wie svn oder cvs ist das Festschreiben teurer und betrifft alle. Durch das Verzweigen wird dieses Problem teilweise behoben. Da es jedoch auf dem Server auftritt, kann es schmerzhaft langsam sein und das Zusammenführen kann umständlich sein. Daher gibt es bei zentralisierten SCMs häufig eine vorsichtigere Kultur, bei der Sie nur dann eine Verpflichtung eingehen, wenn Sie eine erhebliche Menge an Arbeit geleistet haben.

Was das Add-On betrifft: Bitte, bitte tu das nicht. Codezeilen, Anzahl der Festschreibungen, Anzahl der gefundenen / behobenen Fehler usw. sind allesamt sehr schlechte Qualitäts- oder Quantitätsmessungen.

tdammers
quelle
Ich gehe davon aus, dass dies auch für neue Filialen gilt, in denen die gesamte Neuentwicklung für Ihre eigene Filiale übernommen wird. Dh Sie können sogar eine Menge unvollständigen Codes in Ihre eigene private Filiale schreiben.
Juha Untinen
Ja, aber in geringerem Maße, weil Sie (siehe Originalantwort) niemanden direkt stören werden. Abhängig vom jeweiligen SCM wird es normalerweise als gute Praxis angesehen, den Commit-Verlauf zu bereinigen, bevor Sie den Upstream zusammenführen (z git rebase -i. B. ).
tdammers
13

Wenn Sie DVCS wie Mercurial oder Git verwenden, sollten Sie immer dann ein Commit für Ihr lokales Repository ausführen, wenn Sie eine erhebliche Menge an Arbeit erledigt haben. Übertragen Sie es jedoch nur dann in das freigegebene Repository, wenn die in sich abgeschlossene, getestete Änderung funktioniert.

Für nicht verteilte VCS (wie z. B. SVN) gilt dieselbe Logik, anstatt des lokalen Repositorys den privaten Zweig zu verwenden, statt den Hauptzweig per Push-Merge zu verbinden.

vartec
quelle
+1 Ich bin erstaunt, dass dies nicht mehr positiv bewertet wurde. Das war mein erster Gedanke - dvcs oder vcs
Michael Durrant
9

Sie sollten früh und oft festlegen.

Ich kenne Leute, die so oft wie alle 90 Sekunden begehen. Ernsthaft. Es scheint für sie zu funktionieren. Ich habe mit dem Festschreiben jedes Mal experimentiert, wenn ich eine Datei speichere, was wahrscheinlich häufiger als 90 Sekunden ist. Heute lege ich wahrscheinlich ungefähr alle 15 Minuten fest. Ein VCS, mit dem Sie mehrere Commits zu einem zusammenfassen können und das lokale Commits (wie git) zulässt, erleichtert dies erheblich.

Wie oft solltest du begehen? Schwer zu sagen, aber wahrscheinlich öfter als jetzt. Legen Sie sich immer öfter fest, finden Sie einen Punkt, der sich zu oft absurd anfühlt, und ziehen Sie sich dann etwas zurück. Die Chancen stehen gut, dass Sie am Ende etwas Vernünftiges haben.

Sie messen die Entwicklung eines Produkts anhand des Werts, der an die Benutzer geliefert wird. Es gibt keine andere genaue Messung.

Rein Henrichs
quelle
1
+1. Wenn Sie BDD-As-If-You-Mean-It, Refactor Till You Drop, Atomic Coding und eine ausdrucksstarke Sprache kombinieren, können 90 Sekunden eine lange Zeit ohne Commit sein.
Jörg W Mittag
8

Commits sind die Bausteine ​​aller versionskontrollierten Daten / Codes. Jedes Commit sollte genau eine der folgenden Aktionen ausführen:

  • Fügen Sie ein neues Datenelement oder eine neue Funktion hinzu
  • Beheben Sie einen oder mehrere Fehler (wenn möglich einen Commit für jeden Fix). Dabei kann es sich um Folgendes handeln:
    • Leistungsverbesserung
    • Korrigieren des falschen Codeverhaltens
    • Tippfehler beseitigen
  • Refactoring von Code oder Daten ohne Änderung der Semantik. Das beinhaltet:
    • Code umschreiben, der sich identisch mit dem Original verhält
    • Ändern der Darstellung von Daten in ein anderes Format
    • Formatieren von Code oder Daten gemäß den Formatierungsrichtlinien des Projekts
  • Änderungen aus einer anderen Filiale zusammenführen (entweder Upstream / Downstream)

Auch bei der Arbeit in Zweigen müssen Commits zu einem Zweig gehen, der geeigneter ist. Zwei Festschreibungen sollten nicht dieselbe Festschreibungsnachricht enthalten (was ähnliche Änderungen impliziert), sondern sich in verschiedenen Zweigen befinden, da dies die Mitarbeiter verwirrt. Besser ist es, den Hauptzweig zu übernehmen und ihn mit dem Feature-Zweig zusammenzuführen.

Wenn Committer die obige Regel befolgen, ist es unerheblich,

  • Machen Sie eine bestimmte Änderung ohne Nebenwirkungen rückgängig
  • Identifizieren Sie das Verhalten, das Codeänderungen aufgrund von Codeformatierungsänderungen ändert
  • Zusammenführen verschiedener Zweige, um die meisten Konflikte zu vermeiden
  • Arbeiten Sie mit anderen Entwicklern zusammen, die Ihre Änderungen problemlos vornehmen können

In Bezug auf die Messung des Projektfortschritts anhand von Commits ist es möglich, dass Refactoring-Commits und Fehlerbehebungs-Commits nicht berücksichtigt werden.

justjkk
quelle
Ich denke, diese Antwort muss die akzeptierte Antwort sein, aber wahrscheinlich suchte der Fragesteller nach einer einfacheren Erklärung :)
Behnam Rasooli
7

Ein Commit wird nur durchgeführt, wenn Sie die angegebene Funktion / das Modul / die Funktionalität erfolgreich in einem Gerät getestet haben und mit hinreichender Sicherheit zur Integration oder zum Testen des Systems bereit sind.

Und um Ihre Zusatzfragen zu beantworten - NEIN !! Das Maß für den Standort des Projekts sollte niemals durch die Anzahl der Festschreibungen bestimmt werden. Wer weiß, was tatsächlich festgeschrieben wurde? Wurde es erfolgreich systemgetestet oder sogar einheitengetestet? Nur weil es engagiert ist, heißt das nicht, dass es produktionsbereit ist.

Catchops
quelle
5
Dies wäre der Fall, wenn Sie einen Commit für den Trunk ausführen, aber wenn Sie einen Commit für einen Feature-Zweig oder einen privaten Zweig ausführen, muss dieser nicht für die Integration bereit sein.
Neil Butterworth
1
@ Neil Butterworth: ... es sei denn, es gibt andere Entwickler, die mit Abhängigkeiten von Ihrem Code an demselben Zweig arbeiten.
FrustratedWithFormsDesigner
@Frustrated In diesem Fall sollte es auf jeden Fall kompilierbar sein, aber ich sehe nicht, dass es für die Integration und Systemtests bereit sein muss.
Neil Butterworth
1
Interessante Zweiteilung hier zwischen verteilten und zentralisierten vcs. Bei verteilten virtuellen Computern ist dies kein Problem, da Sie sich dazu verpflichten können, Zweigstellen lokal bereitzustellen und anderen Entwicklern aus dem Weg zu gehen.
George Mauer
2
@ George - Dies ist eine falsche Zweiteilung. Die eigentliche Zweiteilung besteht zwischen der Verwendung von privaten (pro Entwickler) Zweigen oder öffentlichen (von mehreren Entwicklern gemeinsam genutzten) Zweigen. Dies ist orthogonal zu der Frage, ob Sie ein zentrales verteiltes VCS verwenden (DVCS ermutigen jedoch private Zweige, da Zweige als privat beginnen, bis Sie sie veröffentlichen).
Stephen C. Steel
6

Als Add-On: Ist es richtig, die Entwicklung eines Projekts anhand seiner Commits zu messen?

Nein. Es gab eine tägliche WTF darüber, warum das eine schreckliche Idee ist.

Meine allgemeine Faustregel beim Festschreiben von Code lautet, dass ich einchecke, wenn ich einen Codeabschnitt fertiggestellt habe und dieser kompiliert wird. Chunk ist nicht wirklich definiert. Wenn es eine kleine Aufgabe ist, werde ich vielleicht erst einchecken, wenn ich damit fertig bin. Wenn es größer ist, kann es sein, dass ich nach Abschluss jedes logischen Abschnitts einchecke.

Aber checke niemals ein, wenn es nicht kompiliert wird. Ich weiß, es scheint eine dumme Sache zu sein, es laut auszusprechen, aber ich musste es den Leuten vorher erklären.

Tyanna
quelle
1
+1 für Kompilierungswarnung. Wir hatten ein Sparschwein im Büro, bei dem jeder jedes Mal eine Gebühr zahlen musste, wenn er / sie etwas begangen hatte, bei dem ein Build fehlgeschlagen war. Leider haben wir auf diese Weise ziemlich viel Geld bekommen, zumindest anfangs :)
Ray
@Ray - an meinem letzten Platz ging die Geldstrafe in den Lottofonds. Leider haben wir es nie reichlich von dieser schlechten Angewohnheit gestrichen. : P
Tyanna
1

Machen Sie ein Commit, wenn der Code für andere Benutzer des Codes freigegeben werden kann - wenn er relativ stabil, sicher und ordnungsgemäß getestet ist.

Und nein, ich denke nicht, dass Commits eine großartige Metrik für die Entwicklung eines Projekts sind, da ich einige Entwickler kenne, die jede kleine und kleine Änderung vornehmen, und andere, die nur große große Änderungen an der Funktionalität vornehmen. Wie messen Sie quantitativ den Wert eines Commits gegenüber einem anderen?

FrustratedWithFormsDesigner
quelle
Denken Sie daran, dass Sie bei verteilten Systemen! = Share festlegen. Sie sollten pushen, wenn Sie etwas zum Teilen bereit haben.
Rein Henrichs
@Rein Henrichs: Guter Punkt, obwohl die Quellcodeverwaltung hier bei der Arbeit nicht über diese Funktionalität verfügt (zumindest soweit ich weiß). Wenn etwas festgeschrieben ist, kann jeder andere im Projekt es sehen und erneut synchronisieren (und das tun sie normalerweise, manchmal blind).
FrustratedWithFormsDesigner
Dies könnte ein Hinweis darauf sein, dass Sie von besseren Tools profitieren könnten. Alles, was häufige Einsätze verhindert, ist eine unnötige Behinderung.
Rein Henrichs
@ Rein Henrichs: Das werde ich nicht bestreiten !!
FrustratedWithFormsDesigner
1

Sobald die entsprechende Aufgabe erledigt ist . Eine Aufgabe ist Teil einer User Story .

Eine Aufgabe ist erledigt, wenn:

  • die entsprechende Unit-Tests-Passe,
  • Code ist ordnungsgemäß dokumentiert und
  • Code wird festgeschrieben.

Sie können eine andere Definition von "erledigt" haben .

Ich sehe den Wert nicht in der Anzahl der Commits. Wenn Sie jedoch jemanden sehen, der über einen längeren Zeitraum an derselben User Story (oder, schlimmer noch, Storys) arbeitet, ist dies ein Geruch.


quelle
1

Führen Sie jede wesentliche Änderung durch, von der Sie nicht glauben, dass sie etwas kaputt macht. Das einzige, was Sie nicht festschreiben sollten, sind Stiländerungen, da sie keine Änderungen in der Logik beinhalten. Aber ansonsten ist es umso besser, je kleiner die Änderungen sind, die Sie vornehmen.

Je kleiner die Commits sind, desto detaillierter können Sie den Gedankenprozess dokumentieren, was ein Aspekt eines guten Commit-Protokolls ist. Eine gute Codeüberprüfung sollte nicht nur das Codeergebnis, sondern auch den Denkprozess betreffen.

Da ich viele kleine Commits habe, ist es auch einfach, sie zu halbieren, eine viel zu wenig genutzte Funktion der Versionskontrolle, die mir viele Stunden erspart hat, nach Nadel-Bugs in Heuhaufen-Codebasen zu suchen.

Kurz gesagt: Halbieren; Entdecken Sie ein Problem in der aktuellen Codebasis. Wählen Sie dann im Änderungsprotokoll ein Commit aus, bei dem Sie sicher sind, dass das betreffende Problem nicht vorhanden ist. Beginnen Sie mit dem Auschecken des Commits genau in der Mitte zwischen der "guten" und der "schlechten" Version. Prüfen Sie, ob das Problem weiterhin besteht. Wenn dies der Fall ist, müssen Sie einen Blick in die Mitte des "guten" und des zuvor getesteten Commits werfen. Wenn das Problem behoben ist, wurde es nach dieser speziellen Änderung eingeführt. Überprüfen Sie daher die Mitte zwischen dem "schlechten" und dem zuvor getesteten Commit. Wiederholen. Schließlich werden Sie das Commit erhalten, das das Problem verursacht hat. Aber nur, wenn Sie kleine Commits haben, sonst wissen Sie, in welchem ​​großen Haufen von Änderungen das Problem aufgetreten ist.

So funktioniert es mit Git, aber das Prinzip gilt für jede Versionskontrolle.

Jasper Kennis
quelle
Dies scheint nichts Wesentliches über die in 10 vorherigen Antworten gemachten und erklärten Punkte zu bieten. Außerdem scheint sich der letzte Absatz auf ein git-spezifisches Feature zu beziehen, während sich die Frage anscheinend nicht um git
gnat
Die Zweiteilung ist nicht git-spezifisch. Es kann mit jeder Art von Versionskontrolle durchgeführt werden, dies war nur ein Beispiel, da mir bekannt ist, dass Git es eingebaut hat.
Jasper Kennis
-1

Wann:

  • es baut (IMMER)
  • Komponententests bestehen
  • es funktioniert (es sei denn, es ist eindeutig als "work in progress" gekennzeichnet)
  • Die Vorteile des Speicherns des Codezustands machen das Ausführen der Tests, das Überlegen einer guten Festschreibungsnachricht und das Lösen von Zusammenführungskonflikten während des Festschreibungsprozesses überflüssig
quant_dev
quelle
Dafür ist unsere beste Praxis.
Jersoft