Ich bin ein einziger Entwickler bei meiner Arbeit und verstehe die Vorteile von VCS. Es fällt mir schwer, mich an gute Praktiken zu halten. Im Moment benutze ich git, um hauptsächlich Web-Apps zu entwickeln (die aufgrund meiner Arbeit niemals als Open-Source-Version verfügbar sein werden).
Mein aktueller Arbeitsablauf besteht darin, viele Änderungen an der Entwicklungssite vorzunehmen, Änderungen zu testen, zu überarbeiten, zu testen, glücklich zu sein und festzuschreiben und dann die Festschreibung auf die Live-Site zu übertragen (wenn ich also an einer großen neuen Änderung arbeite, kann ich nur einmal pro Woche festschreiben, aber meine IDE hat einen guten Rückgängig-Verlauf für nicht festgeschriebene Sachen.
Grundsätzlich verwende ich git nur, wenn ich zwischen Computern wechsle (z. B. von einem Entwicklercomputer zu einem Heimentwicklercomputer oder zu einer Live-Maschine), aber tagsüber sehe ich den Vorteil nicht wirklich. Dies führt dazu, dass ich lange Änderungslisten habe (und es fällt mir schwer, für jedes Commit eine gute Nachricht zu finden; und wenn ich in Eile bin, hinterlasse ich gewöhnlich beschissene Nachrichten wie "Verschiedene Änderungen an Admin und Vorlagen").
Wie oft sollte ich mich verpflichten? Sollte jede einzeilige Änderung ein Commit erhalten? Sollte ich mich vor einem Test verpflichten (zB zumindest für Syntax- / Kompilierungsfehler und muss es dann komplett rückgängig machen; da die Idee nicht funktioniert hat oder die Nachricht eine Lüge ist)?
Sollte ich sicherstellen, dass ich mich jeden Morgen / Nachmittag verpflichte, bevor ich aufhöre, zum Abendessen zu arbeiten, solange es noch frisch ist? Was verpasse ich, wenn ich schlechte VCS-Gewohnheiten habe?
quelle
Antworten:
Sie vermissen viel.
In gewisser Weise bin ich auch solo. Ich begebe mich jedes Mal, wenn ich eine signifikante Änderung vornehme oder bevor ich eine signifikante Änderung vornehme, damit ich zurückgehen kann, wenn ich Dinge vermassle, und von Zeit zu Zeit, auch wenn ich nichts Großes mache. Nicht wirklich jeden Tag, aber in der Nähe. Manchmal ein paar Mal am Tag.
Was ich bekomme, ist, dass ich jederzeit zurückkehren kann. Welches ist viel. Außerdem hilft es, wenn die Filialen bestellt sind.
Ich denke, es gibt mir viel Ordnung.
Ich benutze svn und habe es satt. Aber ich kann nicht mehr Zeit damit verbringen, etwas anderes zu lernen.
Viel Glück.
quelle
Sie sollten häufig festlegen. Sie sollten sich auf jeden Fall verpflichten, nachdem Sie einen logischen Meilenstein erreicht haben. Wenn dies länger als einen Tag dauert, sollten Sie sich mindestens am Ende Ihres Arbeitstages festlegen oder, noch besser, Ihre Arbeit in kleinere Stücke aufteilen.
Dafür gibt es viele Gründe. Was ist zum Beispiel, wenn Ihr Computer abstürzt? Es ist viel besser, nur einen Tag Arbeit zu verlieren als eine Woche oder einen Monat. Ein weiterer Grund ist, dass häufige Commits das Isolieren eines Fehlers erleichtern. Sie können eine binäre Suche durchführen und herausfinden, welche kleine Änderung den Fehler verursacht hat.
Eine andere Sache: Bevor Sie sich verpflichten, sollten Sie einen Vergleich anstellen und sich alle Änderungen ansehen, die Sie vorgenommen haben. So können Sie überprüfen, ob alle Änderungen sinnvoll sind und Sie nichts vergessen haben. Dies hilft Ihnen auch dabei, eine bessere Commit-Nachricht zu erstellen. Und dies ist natürlich ein weiterer Grund, sich häufig zu engagieren: Es ist viel einfacher, die Änderungen eines Tages durchzuarbeiten, als die eines Monats.
quelle
Um CVS optimal zu nutzen, sollten Sie jeweils an einem Feature / Bugfix arbeiten und ein Commit durchführen, wenn dieses Feature / Bugfix abgeschlossen ist. Auf diese Weise erhalten Sie:
Da Sie zwischen PCs wechseln, sollten Sie mindestens zwei Zweige haben:
quelle
git stash
zeigen, was Sie haben, oder ein bestimmtes Commit auschecken. Wenn Sie große Änderungen in Arbeit haben, sollten sich diese natürlich in einem separaten Zweig in Arbeit befinden, sodass Ihr Master-Zweig der de facto stabile Zweig ist.Wenn das ist, was einen Fehler behebt, sicher.
Ich habe mit einem Typen gearbeitet, der "schlechte VCS-Gewohnheiten" hatte. Er liebte es, alleine zu arbeiten und war verantwortlich für eine Produktlinie, die ungefähr 1.000.000 USD / Jahr einbrachte. Er würde nur dann etwas unternehmen, wenn der Chef ihn nörgelte. Dann stürzte eines Tages seine Festplatte ab. Nachdem wir einen Ersatz für ihn eingerichtet hatten, stellten wir fest, dass sein letzter Check-in 6 Monate zuvor war. Da das VCS Source Safe war, können Sie erraten, was sonst noch schief gelaufen ist - das letzte Commit war beschädigt. Wir mussten mehr als ein Jahr zurückgehen, um eine unbeschädigte Version seiner Produktlinie zu erhalten. Er wurde nicht gefeuert, obwohl er hätte sein sollen.
Eine andere Anekdote betrifft mich. Früher habe ich Code für Hobby- und Forschungsprojekte auf Wechseldatenträgern gespeichert. Eines Tages wurde in meine Wohnung eingebrochen. Der Laptop (der kaputt war) und alle austauschbaren Festplatten wurden gestohlen. Jede DVD (mit Ausnahme von Red Dawn) wurde gestohlen. Keiner der Desktop-Computer wurde gestohlen. Wenn ich eine externe Quellcodeverwaltung hätte, hätte ich keine Projekte im Wert von 15 Jahren verloren, zumal einige auf akademischen Projekten beruhten - viele der Profis verließen die akademische Welt, um in die Privatwirtschaft zu gehen, und diese Projekte verschwanden in einem unternehmensweiten schwarzen Loch verlorener Code nicht wiederherstellbar.
Ich zerlege es in ein paar Metriken:
Wie viel Arbeit sind Sie bereit zu verlieren, wenn Ihr Computer ausfällt? oder gestohlen wird?
Wenn dies Bug_1234 behebt, checken Sie den Code mit dem Kommentar "fixes Bug_1234" ein.
Wenn es sich um eine logische Übermittlung / einen logischen Meilenstein handelt, checken Sie ihn mit einem Kommentar wie "Bug_1234, form_xyz" (oder Task_1234 entsprechend) ein.
Checken Sie den Code immer am Freitagabend ein, bevor Sie nach Hause fahren. Machen Sie auch einen Check-in (oder machen Sie den Checkout rückgängig), bevor Sie in den Urlaub fahren.
Wann immer es die Unternehmensrichtlinie vorschreibt.
quelle
Denken Sie nicht an die Anzahl der Zeilenänderungen. Denken Sie in Funktionsblöcken. Mit VCS können Sie eine Überschrift an einer zentralen Stelle für jeden Funktionsblock angeben, sodass Sie leicht sehen können, was hier passiert ist, z. B. mit dem Git-Protokoll.
Außerdem können Sie mit IDEs wie Eclipse auf eine bestimmte Linie zeigen und zu dem Commit wechseln, das sie in die Form gebracht hat, die Sie sehen. Mit anderen Worten, Sie können direkt von einer Quellzeile zum Festschreiben wechseln. Wenn das Commit klein ist und eine gute Nachricht enthält, ist es viel hilfreicher als "Tonnen von Fehlern behoben".
quelle
Ich würde sagen, das größte Problem, das Sie beim Gruppieren von Änderungen verpassen, ist die Möglichkeit, herauszufinden, wann und wo Fehler aufgetreten sind.
Nach meiner Erfahrung ist ein Fehler zwei bis drei Wochen nach seiner Einführung aufgetaucht, und es ist so lange nach der Einführung schwierig, die Commits einer Woche durchzuarbeiten. In diesen Fällen war es hilfreich, die Commits einfach binär zu durchsuchen, um herauszufinden, welche individuelle Änderung das Problem verursacht hat. Bei diesen Fehlern handelte es sich hauptsächlich um Fehler bei der Speichernutzung von C ++ - Code, sodass sie in Ihrem Projekt möglicherweise nicht so häufig auftreten.
Bei der Entwicklung in einem Team kommen weitere Vorteile zum Tragen: einfache Festschreibungskommentare, einfachere Zusammenführungen, Zuordnung von Festschreibungen zu Fehlerkorrekturen usw.
Ich nehme an, dass Sie, wenn Sie täglich oder halbtäglich mit dem Commit beginnen, mithilfe von Tags oder Lesezeichen verfolgen müssen, welche Codeversion auf der Live-Site verwendet wird. Ich würde sagen, das ist das Wichtigste, um den Überblick zu behalten.
quelle
Ich bin auch ein Solo-Entwickler, ich benutze SVN und ich liebe es. Ich habe sogar ein Tool geschrieben, mit dem ich die Struktur meiner Datenbank und die darin enthaltenen Testdaten in XML konvertieren kann, damit ich diese in die Quellcodeverwaltung einbeziehen kann.
Normalerweise verpflichte ich mich, wenn ich eine autonome Arbeitseinheit abgeschlossen habe. Wenn ich hier und da ein paar triviale und nicht verwandte einzeilige Korrekturen durchführe, gebe ich manchmal alle zusammen, aber wenn eine einzeilige Korrektur zufällig zwischen zwei nicht verwandten großen autonomen Arbeitseinheiten auftritt, erhält sie ihre eigenen begehen, daran ist nichts auszusetzen.
Außerdem gebe ich immer Code ein, der kompiliert, und fast immer Code, der auch alle grundlegenden Tests besteht. Wenn nicht, stelle ich sicher, dass die Commit-Nachricht "DOES NOT WORK" enthält. Der einzige Fall, in dem dies passiert, ist, dass ich wichtige Änderungen vorgenommen habe, die ich nicht verlieren möchte, obwohl sie noch nicht ganz funktionieren, und außerdem bin ich kurz davor, mich auf ein großartiges Refactoring-Abenteuer einzulassen, bei dem ich nicht sicher bin, ob es wird erfolgreich sein. Ich verwende das Repository also als Backup meiner bisherigen Arbeit, bevor ich riskiere, es zu vermasseln und wegzuwerfen.
Dies bedeutet, dass ich immer festschreibe, wenn mein Quellcode festgeschrieben werden muss. Es macht absolut keinen Sinn, morgendliche oder abendliche Festschreibungsregeln zu haben. Es ist der Zustand, in dem sich der Code befindet, der vorschreibt, ob es Zeit für ein Commit ist oder nicht.
Die Nachrichten, die Sie in das Repository stellen, sind unwichtig. Wenn Sie sich absolut nichts Bedeutendes einfallen lassen, ist es immer noch besser, eine leere Nachricht festzuschreiben, als überhaupt nichts festzuschreiben, wenn Sie sollten.
Wenn Ihnen keine gute Commit-Nachricht einfällt, weil alles, was Sie sich einfallen lassen, dumm klingt, denken Sie daran, dass dies in Ordnung ist. Es wird erwartet, dass Commit-Nachrichten das Offensichtliche angeben, so dass sie für Sie beim Schreiben dumm klingen. Aber glauben Sie mir, wenn Sie einen Monat später alte Revisionen überprüfen müssen, sind Sie dankbar, dass selbst die dummen Nachrichten keine Nachrichten enthalten.
quelle
Übernehmen Sie jedes Mal, wenn Sie eine "logische" Änderung vornehmen. Wenn Sie beispielsweise eine neue Funktion implementieren, tun Sie dies Schritt für Schritt. Jeder dieser Schritte hängt normalerweise voneinander ab. Sie können diese Schritte also einfach separat festschreiben und in der Festschreibungsmeldung erläutern, warum jeder Schritt erforderlich ist.
Die Commit-Nachricht ist wirklich wichtig. Sie müssen vermeiden, zu sagen, was Sie tun, und erklären , warum Sie es tun. Der Code dokumentiert die Änderungen bereits, aber in 6 Monaten werden Sie froh sein zu sehen, warum Sie sie durchgeführt haben.
Dies ist auch nützlich, wenn zufällig jemand einspringt und Sie nicht mehr alleine sind. Selbst für Sie macht es eine saubere Historie einfacher, a zu verwenden, um
git blame
zu wissen, wann und warum diese fehlerhafte Zeile geändert wurde.Durch kleine Festschreibungen anstelle von großen Schlammballenänderungen können Sie auch den Zwischenzustand testen. Sie können die Änderungen verwahren, wenn Sie dringend etwas freigeben müssen. Wenn Sie einen Fehler einführen, während er zuvor funktionierte, können Sie ihn verstecken und prüfen, ob es Ihre nicht festgeschriebenen Änderungen sind, die den Fehler auslösen, oder ob dies in einem älteren Commit enthalten war.
Sie können auch die Kraft entfesseln
git bissect
, die Ihnen die Festschreibung dieses bösen Fehlers verrät. Wenn das Festschreiben 2.000 Zeilen lang ist, hilft es immer noch, aber nicht so viel ...Eine andere Sache ist, dass dies der erste Schritt für die kontinuierliche Integration (CI) und anschließend für die kontinuierliche Bereitstellung (CD) ist. CI und Ihre Tests können bei einem neuen Commit ausgelöst werden, wodurch Sie jedes Mal benachrichtigt werden, wenn Sie Ihre Änderungen vornehmen, ob sie zu Problemen führen oder nicht. Auf diese Weise können Sie feststellen, ob die Bereitstellung sicher ist oder nicht, und Sie werden sofort darüber informiert, wenn das Problem auftritt, und nicht erst vor Ihrer Veröffentlichung, wenn Sie in Eile sind.
Zu Ihren anderen Fragen:
git rebase --interactive
).git add --patch
, um diese zu inszenieren.quelle
Als Solo-Entwickler verpflichte ich mich in der Regel immer dann, wenn ich das Gefühl habe, nach einem Basistest eine wesentliche Änderung vorgenommen zu haben, und wenn ich am Ende der Nacht ein Projekt verlasse.
Nein, es sei denn, diese einzeilige Änderung wird eine Funktion oder einen Fehler erheblich verändern.
Wahrscheinlich nicht. Zumindest für mich teste und codiere ich den größten Teil auf einer 'Arbeitskopie' und verpflichte mich, nachdem ich mit meinen Änderungen zufrieden bin. In vielen IDEs wird mir angezeigt, was sich geändert hat, bevor ich das Commit ausgeführt habe, und ich kann dem Commit Notizen hinzufügen
Ich bin nicht sehr vertraut mit VCS oder welchen schlechten Gewohnheiten es verursacht. Ich glaube, ich habe meine Meinung dazu in der Antwort auf die erste Frage größtenteils geteilt.
Als Antwort auf die allgemeine Frage, die gestellt wurde, verwenden Sie anscheinend hauptsächlich Commits als Zweige, die in einem anderen Antwortpost angesprochen werden. Ich bin mir nicht sicher, welche IDE Sie verwenden, die einen guten Rückgängig-Verlauf usw. hat, aber ich habe keine gefunden, die nach einem Neustart der IDE und einem Wechsel zwischen Computern meines Erachtens gut war.
quelle
I am not very familiar with VCS or what bad habits it causes.
Du Glückspilz!Ich bin ein gewohnheitsmäßiger Committer und habe festgestellt, dass das zu mir passt, aber zugegebenermaßen sind meine Commit-Nachrichten fast immer wie folgt:
Daher kann ich nicht genau sagen, dass solche häufigen und gewohnheitsmäßigen Festschreibungen für meinen Zweig (Quecksilber) genau die detailliertesten Festschreibungsprotokolle gefördert haben. Manchmal gebe ich sogar Code zur Hälfte ein, wenn meine Frau mich zum Abendessen auffordert. Dann kopiere ich die vorherige Commit-Nachricht "Working on [...]" und verwende sie.
Meine Commit-Log-Muster sind in der Regel wie folgt:
"Working on [...] Working on [...] Working [...] Completed [...] Started working on [...] Working on [...] Completed [...] Started working on [...]"
Auf der anderen Seite hat es meinen Hintern gerettet. Manchmal stoße ich auf einen Randfall, den ich nicht vorhergesehen und getestet habe. An diesem Punkt helfen mir die häufigen Commits, herauszufinden, wo genau ich den Fehler eingeschleust habe.
Ich kenne die besten Gewohnheiten nicht und bin sicherlich nicht derjenige, der sich die idealen Commit-Protokollierungsgewohnheiten ansieht, aber ich kann mit Sicherheit sagen, dass ein häufigeres Commit auf jeden Fall hilfreich sein kann, wenn Sie eine Regression durchführen müssen.
Ich habe vorher einzeilige Änderungen vorgenommen, aber normalerweise schwierige, und vielleicht hatte ich zu wenig Zeit. Meine Verpflichtungen ähneln nicht immer perfekten und vollständigen Arbeitseinheiten oder Veränderungen. Wie gesagt, manchmal sind sie nur das Ergebnis meiner Frau, die mich unerwartet zum Abendessen auffordert.
Viele meiner Commits, die diesem
"Working on [...]"
Protokollmuster folgen, sind keine kohärenten Veränderungseinheiten (weshalb ich mir oft keine bessere Botschaft einfallen lassen kann als"Working on [...]"
), sondern nur das Ergebnis einer Verschnaufpause, als würde ich mir eine Tasse Kaffee machen. Die"Completed [...]"
Nachricht zeigt das Ende dieser Arbeitseinheit an, und dort schreibe ich oft eine viel detailliertere Nachricht zusammen mit den"Started working on [...]"
Nachrichten des ersten Typs, wenn ich gerade anfange, an etwas zu arbeiten. Wenn Sie durchschnittlich alle 15 Minuten Commits durchführen, sind diese [...] "Arbeiten an" -Nachrichten eher wie Zwischenmeldungen für das, was jemand in einem umfangreichen Commit mit einer detaillierteren Nachricht festschreibt.Ich gehe einfach vor und lege es fest, bevor ich manchmal sogar Tests durchführe (erneut, wenn ich ein unerwartetes Ereignis hatte). Auch wenn ich alleine bin, drücke ich auf einen Server (nur einen, der hier zu Hause in einem LAN läuft), der CI ausführt. Das mag übertrieben erscheinen, aber keine Ahnung, ich habe mich daran gewöhnt, mich an meinen früheren Arbeitsplätzen darauf zu stützen. Außerdem möchte ich nicht jedes Mal alle Geräte- und Integrationstests von Hand ausführen müssen. Ich mag es, wenn das alles nur mit Druck zu tun hat. Wenn ein Test fehlschlägt, ist es einfach genug, vorwärts zu arbeiten, wo ich die Regression durchführe, den Fehler in der letzten Version zu korrigieren und weiterzumachen. Das heißt, ich erstelle den Code gegen einen Debugbuild, bevor ich festschreibe.
Ich setze mich gerne ein, bevor ich rausgehe und eine Pause zwischen dem Programmieren mache. Ich habe nicht wirklich darüber nachgedacht, warum genau, bis ich auf diese Frage gestoßen bin. Ich nehme an, es soll verhindern, dass ich dort, wo ich aufgehört habe, ohne ein Commit-Protokoll weitermache, anstatt dort, wo ich aufgehört habe, dass ich mich unterscheiden kann und so weiter. Hmm, ich muss darauf zurückkommen, da es theoretisch vielleicht nicht nötig ist, wenn man bedenkt, wie oft ich mich verpflichte. Ich fühle mich immer noch wohler beim Festlegen und Schieben, bevor ich den Computer aus irgendeinem Grund verlasse. Einiges davon könnte die frühere psychologische Angst vor, sagen wir, Der Computer brennt, nachdem ich gegangen bin und Projektmanager in den Tagen, in denen wir SVN mit den Entwicklern verwendet haben, manchmal wochenlang beschäftigt waren, ohne uns den Hals runterzureißen und uns ständig daran zu erinnern, den Code so oft wie möglich einzuchecken, während wir uns daran erinnern Unser Code ist Eigentum des Unternehmens. Es ist auch ein bisschen effizienter, vor allem beim Pushing, damit mein CI-Prozess alle Tests ausführen kann, während ich nicht da bin, damit ich zurückkehren und die Ergebnisse sehen kann.
Oh, und manchmal betrinke ich mich nach meiner Abreise etwas und es ist normalerweise eine schlechte Idee, zu versuchen, komplexen Code zu schreiben, während ich mich betrunken fühle (wenn auch nicht immer). Einmal hatte ich ein wirklich nettes Kontextmenüsystem, nachdem ich mich betrunken hatte. aber ich hatte nur 6 Bier und es war nicht so komplex zu codieren). Wenn ich das versuche, habe ich zumindest den nüchtern geschriebenen Code festgeschrieben, bevor ich ging, um zurückzukehren, anstatt den betrunkenen Code mit dem nüchternen Code zu mischen. An diesem Punkt könnte mein Festschreibungsprotokoll so lauten, dass
"Reverting back to code written before Jagermeister shots."
ich das nicht tue Sehr häufig, es sei denn, ich hatte eine betrunkene Code-Inspiration, aber in diesen seltenen Fällen hat es wirklich geholfen, dass ich etwas begangen habe, bevor ich ausgegangen bin und mich betrunken habe.quelle