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:
Übersehen Sie absichtlich Dinge, die nichts miteinander zu tun haben, während Sie an etwas arbeiten.
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.
Ä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:
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.
Dies erhöht die manuelle Arbeit und ist fehleranfällig.
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?
quelle
git add -p
eine 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.Antworten:
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.
quelle
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 eingit stash pop
und fahre dort fort, wo ich aufgehört habe. Genau dafür wurden diese Funktionen entwickelt.quelle
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.
quelle
Eine Option, die ich häufig verwende, ist das Hinzufügen von
TODO
Kommentaren und häufige "teilweise" Festschreibungen, indemgit add --patch
Sie die relevanten Teile der Datei mit auswählen. Verwenden Sie danngit 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 rebase
In diesem Zusammenhang ist an a nichts auszusetzen, da Sie nur lokale Commits umschreiben.quelle
Eine andere Möglichkeit könnte darin bestehen, Ihre aktuellen Änderungen zu "verstecken". Der Workflow würde folgendermaßen aussehen:
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 )git stash pop
quelle
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
.quelle