Aufteilen des Codierungsfortschritts in sinnvolle Festschreibungen ohne zu viel Overhead

23

Wenn ich an einem Fix oder einer Funktion arbeite, stolpere ich manchmal über andere winzige Probleme, die sich im Handumdrehen in Sekundenschnelle beheben lassen. Wenn ich sie sofort durchführe und dann das fertige Feature / den Fix festschreibe, enthält das Festschreiben mehr als eine Sache. Zum Beispiel "add feature X and code clean up"oder "fix bug X and improved logging". Es wäre besser, dies in zwei Commits aufzuteilen. Falls die beiden Änderungen in derselben Datei vorgenommen wurden, kann ich nicht einfach eine Datei hinzufügen, festschreiben, die andere hinzufügen und dann erneut festschreiben. Daher sehe ich die folgenden drei Optionen:

  1. Übersehen Sie absichtlich Dinge, die nichts miteinander zu tun haben, während Sie an etwas arbeiten.

  2. Kopieren Sie die Datei mit zwei Änderungen, setzen Sie sie zurück, schließen Sie eine Änderung ein, übernehmen Sie die andere Änderung, übernehmen Sie sie erneut.

  3. Ändern Sie keine kleinen Dinge, die nichts miteinander zu tun haben, sondern fügen Sie sie einer Aufgabenliste hinzu und führen Sie sie später aus.

Ich mag nicht wirklich alle drei Optionen, aus den folgenden Gründen:

  1. Die Codequalität kann leiden, wenn man kleine Probleme nicht behebt. Und ich fühle mich schlecht, wenn ich bewusst eine Chance verpasse, ohne großen Aufwand etwas zu verbessern.

  2. Dies erhöht die manuelle Arbeit und ist fehleranfällig.

  3. Dies ist in Ordnung für nicht allzu kleine Aufgaben, aber das Hinzufügen eines winzigen Elements zu einer Aufgabenliste und das spätere Wiederauffinden dauert oft viel länger als das sofortige Beheben.

Wie gehen Sie mit solchen Situationen um?

Tobias Hermann
quelle
7
Können Sie mit git nicht einzelne Zeilen anstatt ganze Dateien einchecken?
Kilian Foth
Ich benutze git add -peine Menge, mit der ich interaktiv die Teile der Dateien auswählen kann, die ich festschreiben möchte. Wenn die Reinigung ausreichend getrennt ist, ist dies einfach durchzuführen. Wenn die Trennung schwieriger ist, lege ich den Status für einen temporären Zweig fest und füge die Änderungen dann manuell zu meinem tatsächlichen Zweig hinzu, bis für den temporären Zweig kein Unterschied mehr besteht. Dies erfordert viel mehr Arbeit, aber ich kann überprüfen, ob jedes Commit für sich funktioniert.
Amon
1
@gnat: offensichtlich kein Betrüger. OP fragt nicht nach der richtigen Größe eines Commits - er möchte kleine Commits machen. Er ist nur auf der Suche nach einem effizienteren Weg, dies zu tun.
Doc Brown
2
@gnat: Die beste Antwort sagt nichts (!) darüber aus, wie man mit verschiedenen Änderungen in einer Datei umgeht und wie man sie in separate Commits aufteilt.
Doc Brown

Antworten:

11

Ich denke, dass man beim Programmieren sehr pragmatisch sein muss. Selbst wenn es möglich ist, das perfekte Schema, den perfekten Workflow oder die perfekte Implementierung zu formulieren, müssen Sie manchmal nur Ihre Arbeit erledigen. Folgendes mache ich:

Ich nutze die Fähigkeit von git, wenn immer möglich, einzelne Hunks und Lines zu inszenieren / festzuschreiben, um nicht verwandte Änderungen zu trennen, obwohl dies gelegentlich zu vorübergehenden Problemen führen kann, wenn die Trennung nicht ordnungsgemäß durchgeführt wurde. Da die Änderungen nebeneinander liegen, ist dies normalerweise kein schwerwiegendes Problem, es sei denn, Sie testen jede einzelne Änderung in Ihrer CI-Pipeline.

Wenn die nicht damit zusammenhängende Änderung zu groß ist, werde ich sie auf eine Aufgabenliste setzen und sie in der Regel direkt danach übernehmen, solange ich sie noch im Kopf habe. Manchmal kann es ein oder zwei Tage dauern, bis ich darauf zurückkomme, es hängt von meiner aktuellen Aufgabe und meinem Gedankengang ab. Gelegentlich setze ich einfach ein TODO: neben den anstößigen Code, wenn ich keine gute Lösung parat habe.

Es kommt vor, dass es einfach nicht praktikabel ist, Dinge zu trennen, und ich werde die geringfügige Änderung zusammen mit der ursprünglichen Arbeit vornehmen.

Die Größe der Änderung ist normalerweise der bestimmende Faktor bei der Auswahl der Route, aber am Ende würde ich eine Workflow-Regel lieber ignorieren, als einen Geruch zu hinterlassen.

axl
quelle
7

Mein Editor verfügt über ein Plugin , mit dem sich einzelne Teile einer Datei ganz einfach bereitstellen lassen. Ich stelle mir vor, andere Programmierer-Editoren haben möglicherweise ähnliche Plugins, obwohl Sie dies immer manuell tun können git add --patch | -p. Dann verwende ich git stash , um meine anderen Änderungen zu speichern und mein kleines Commit isoliert zu testen. Nachdem ich mich festgelegt habe, mache ich einfach ein git stash popund fahre dort fort, wo ich aufgehört habe. Genau dafür wurden diese Funktionen entwickelt.

Karl Bielefeldt
quelle
2

Der Trick besteht darin, keine Änderungen vorzunehmen, es sei denn, Sie sind bereit, sich so viel Mühe zu geben, wie die Änderung verdient.

Ich tendiere dazu, einer Aufgabenliste einen Kommentar hinzuzufügen (manchmal indem ich dem Code einen Kommentar hinzufüge, manchmal in einer Notiz auf einem Fehlerticket und manchmal indem ich den Code in einem separaten Zweig aktualisiere, in dem ich weiß, dass der Fix irgendwann zusammengeführt wird). Wenn es kein Fehlerticket für ein Rollup kleinerer Qualitätsprobleme gibt, wirf ich ein spezielles dafür auf, damit ich und alle anderen den Grund für diese Codeänderungen beim Zusammenführen des Zweigs feststellen können. Ich ändere nie nur zum Spaß, alles wird nachvollziehbar, sodass meine Kollegen nicht allzu überrascht sind, wenn sich der Code ändert.

Kurz gesagt - ja, übersehen Sie sie beim Codieren. Wenn Sie ein Feature hinzufügen, sollten Sie nicht versucht sein, 2 Features hinzuzufügen, egal wie klein sie sind. Wenn jemand beschließt, Ihren Zweig zurückzusetzen (beispielsweise weil Ihre Funktion nicht mehr benötigt wird), verlieren Sie auch alle Ihre Mini-Bugfixes. In ähnlicher Weise möchten Sie in kritischem Code, der ordnungsgemäß funktionierte, keine kleine Korrektur vornehmen.

gbjbaanb
quelle
1
Das OP schlug nicht vor, zwei Änderungen zu einem Commit zusammenzuführen, ganz im Gegenteil.
Doc Brown
1
@DocBrown schlägt allerdings vor, 2 Änderungen in einen einzelnen Zweig zu mischen, was sich später möglicherweise als unübersichtlich erweist, obwohl es offensichtlich nicht so unübersichtlich ist, wie 2 Änderungen in einem einzelnen Festschreiben.
gbjbaanb
Ok, ich verstehe, was Sie mit Ihrem letzten Absatz vorhaben.
Doc Brown
2

Eine Option, die ich häufig verwende, ist das Hinzufügen von TODOKommentaren und häufige "teilweise" Festschreibungen, indem git add --patchSie die relevanten Teile der Datei mit auswählen. Verwenden Sie dann git rebase --interactive, um die partiellen Festschreibungen in der endgültigen Funktion neu anzuordnen und zusammenzuführen, und korrigieren Sie die Festschreibungen, bevor Sie sie verschieben.

Auf diese Weise bleibt Ihr Haupt-Commit sauber und Sie können andere Probleme, die Sie finden, sofort beheben.

git rebaseIn diesem Zusammenhang ist an a nichts auszusetzen, da Sie nur lokale Commits umschreiben.

Tom
quelle
1

Eine andere Möglichkeit könnte darin bestehen, Ihre aktuellen Änderungen zu "verstecken". Der Workflow würde folgendermaßen aussehen:

  1. Nehmen Sie Änderungen in Bezug auf Funktion A vor
  2. Entdecke Bug B und beschließe, es sofort zu reparieren
  3. Über die Befehlszeile in Ihrem Repo ausführen git stash (danach befindet sich Ihr Code wieder in dem Zustand, in dem er war, bevor Sie mit der Arbeit an Feature A begonnen haben )
  4. Zu diesem Zeitpunkt werden Ihre nicht festgeschriebenen Änderungen für Feature A im "Stash" gespeichert.
  5. Nehmen Sie die erforderlichen Codeänderungen vor, um Fehler B zu beheben, und führen Sie ein Commit für das Repo durch
  6. Von der Kommandozeile ausführen git stash pop
  7. Ihre nicht festgeschriebenen Änderungen für Feature A werden nun aus dem Speicher entfernt und zusammen mit dem (bereits festgeschriebenen) Fix für Bug B in Ihrem aktuellen Code wiederhergestellt
Zach
quelle
Könnten Sie die Funktionsweise dieses Workflows etwas näher erläutern? Wie ist der Status des Repositorys zu jedem Zeitpunkt? Könnten Sie jemanden durch den Prozess der Verwendung von git stash führen?
0

Stellen Sie die mit der Fehlerbehebung verbundenen Änderungen separat bereit (und übernehmen Sie sie). In Git Extensions ist dies extrem einfach. Von der Kommandozeile aus denke ich, müssen Sie tun git add -p.

Andrew Coleson
quelle