Versehentlich nicht verwandte Änderungen in Commits

8

Mein persönlicher Ansatz für ein Git-Commit ist, dass jedes Commit in seiner Vollständigkeit eine Änderungseinheit enthalten sollte.

Wenn ich mich entwickle, konzentriere ich mich normalerweise auf solche Einheiten. Aber manchmal wandert meine Aufmerksamkeit woanders hin und ich arbeite eine Weile an einem anderen Gerät. Dies ist wahrscheinlich nicht optimal, aber ich habe gelernt, mich sorgfältig zu engagieren ( git add --interactiveist ein guter Freund von mir).

Es kann jedoch vorkommen, dass ich vergesse, meine Änderungen selektiv zu inszenieren und stattdessen die gesamte Datei festzuschreiben, da ich glaube, dass alle Änderungen, die ich im Diff sehe, tatsächlich mit derselben Einheit zusammenhängen, obwohl es möglicherweise ein oder zwei Änderungen gibt, die völlig unabhängig voneinander sind.

Dann ich git push.

Ist das gefährlich? Sollte ich mich bemühen, das Commit so zu ändern, dass es nur die beabsichtigten Änderungen enthält? Mein Hauptanliegen ist, dass jeder, der sich die Geschichte noch einmal ansieht, die Veränderung sieht und sich wahrscheinlich einige Minuten am Kopf kratzt, bevor er merkt, dass es höchstwahrscheinlich ein Fehler ist. Schlimmer noch, ich kann mir vorstellen, dass die Änderung sogar verwandt aussieht und der Programmierer den Fehler möglicherweise nicht erkennt.

Das Problem ist, dass ich, da ich bereits gepusht habe, den Serververlauf nicht sicher umschreiben kann, sodass ich wahrscheinlich zuerst das Commit zurücksetzen, es richtig aufteilen und erneut festschreiben müsste. Alternativ könnte ich das Commit einfach mit einer besseren Commit-Nachricht ändern, aber ich müsste wirklich sehr schnell sein, da es auch das Umschreiben des Verlaufs erfordert. Als letzten Ausweg könnte ich einfach die Einheit festschreiben, an der ich als nächstes gearbeitet habe, und eine Notiz hinterlassen, dass es eine entsprechende Änderung beim vorherigen Festschreiben gibt (aber das fühlt sich falsch an).

Ich verstehe, dass dies in Multi-Entwickler-Setups mit ordnungsgemäßem Code-Review-Workflow wahrscheinlich nicht passieren würde. Ich verstehe auch, dass das Umschreiben des Verlaufs die beste Lösung dafür ist, wenn ich der einzige Entwickler eines Projekts bin.

Robert Rossmann
quelle
Verwenden Sie Git Flow? (Produkt, Integration, Feature-Zweige?) Mit Git Flow mache ich mir keine Sorgen über Commits für Feature-Zweige. Die Zusammenführung in die Integration erfolgt nach Abschluss des Features und die Zusammenführung in das Produkt erfolgt nach Veröffentlichung.
RubberChickenLeader
argh es ist so ärgerlich, wenn dies passiert, aber so ein Schmerz, es zurückzurollen und neu zu verpflichten
Ewan
Ich kann sehen, wie die Verwendung von Git Flow dies abschwächen kann (kann nur auf anderen Geräten funktionieren, wenn kein Zweig geändert / erstellt wird), aber ich bin der Meinung, dass der Workflow in meiner aktuellen Arbeitsumgebung mich nur verlangsamen würde. Vielleicht in einem größeren Projekt / einer anderen Arbeit env.
Robert Rossmann

Antworten:

9

Commit-Historie ist von entscheidender Bedeutung, aber aus drei Gründen:

  1. an einen anderen Ort verschmelzen. Sie müssen die Teile aus einem Ast heraussuchen und an anderer Stelle anbringen. Es ist wichtig, dass Sie alle gewünschten Teile und nichts haben, was Sie nicht möchten. Wenn Ihr "chaotisches" Commit also Änderungen enthält, die für die Funktion bestimmt sind, an der Sie arbeiten (und nicht beispielsweise ein versehentliches Commit von etwas anderem), sind Sie gut.
  2. Überprüfen, was einige Zeit später passiert ist - normalerweise, um festzustellen, wann ein bestimmter Fehler oder eine bestimmte Funktion eingeführt wurde. In diesem Fall spielt es keine Rolle, was in den Commits enthalten ist, solange Sie die Änderung, an der Sie interessiert sind, genau bestimmen können.
  3. Code-Review. Gute Peer Reviews werden festgeschrieben und dann überprüft (halten Sie den Entwicklungs- / Festschreibungsprozess nicht auf, indem Sie auf einen Prüfer warten!). In diesen Fällen möchte der Prüfer verstehen, welche Änderungen vorgenommen wurden. Im Allgemeinen ist ein Prüfer jedoch mehr an den allgemeinen Änderungen interessiert. Der Versuch, vorgenommene, zurückgesetzte und erneut vorgenommene Commits zu überprüfen, ist eine zeitraubende Übung im Vergleich zur gleichzeitigen Überprüfung aller drei Commits.

Obwohl sich die Commits von Arbeitseinheiten ideal anhören, sind sie praktisch nichts, worauf man bestehen muss. Ich würde versuchen, Commits vernünftig zu halten, und Arbeitseinheiten sind ein guter Weg, um Commits gesund zu halten, aber versuchen Sie nicht, mit der Commit-Historie herumzuspielen, nur um die Commits sauber zu halten. Das ist so, als würde man eine Codedatei aktualisieren, damit alle Klammern so angeordnet werden, wie Sie es bevorzugen - nett, aber nutzlos.

Wenn Sie nun ein wenig Arbeit für einen anderen Zweig geleistet haben, setzen Sie ihn zurück und legen Sie ihn ordnungsgemäß für den richtigen Zweig fest. Das ist wichtig, aber wenn Sie während der Arbeit an der GUI ein wenig Servercode aktualisiert haben, müssen Sie sich darüber keine Sorgen machen.

gbjbaanb
quelle
1

In diesem Fall ist es keine große Sache, die Änderung beim nächsten Commit einfach rückgängig zu machen. Das Hinzufügen einer richtigen Commit-Nachricht ( Removing the XYZ that I accidentally added in C92A891) reicht für andere Entwickler aus, um die Codeüberprüfung zu verstehen.

Versuchen Sie, die Situation zu vermeiden, anstatt sich Gedanken über die Behebung eines bestimmten Vorfalls zu machen.

Dies ist das eigentliche Problem:

Es kann jedoch vorkommen, dass ich vergesse, meine Änderungen selektiv durchzuführen und stattdessen die gesamte Datei festzuschreiben

Sie sollten sich angewöhnen, niemals eine ganze Datei festzuschreiben (oder das Schlimmste an Ihrem gesamten Arbeitsbereich!). Festschreiben Sie immer Zeile für Zeile oder von einem ganzen Hunk, den Sie untersucht haben.

Wenn Sie auf diese Weise festschreiben (was sich so anhört, als würden Sie die meiste Zeit etwas tun), schleichen sich unbeabsichtigte Änderungen mit weit geringerer Wahrscheinlichkeit in Ihre Festschreibungen ein.

pkamb
quelle
"Festschreiben Sie immer Zeile für Zeile oder von einem ganzen Hunk, den Sie untersucht haben." Warum? Für mich ist die zeilenweise Prüfung und Inszenierung die Ausnahme, nicht die Regel. Ich vermeide es, an mehr als einer Funktion / Korrektur gleichzeitig zu arbeiten (das Umschalten des mentalen Kontexts ist teuer), und selbst wenn ich muss, verwahre ich die Arbeit und entstütze sie nach Bedarf. Aus diesem Grund kann ich die meiste Zeit sicher alle Änderungen und ganzen Dateien festschreiben (natürlich nach Überprüfung des Unterschieds) und muss selten mühsam Zeile für Zeile inszenieren oder jedes Stück mit einem interaktiven Add untersuchen.
ADTC
@ADTC Ich stelle fest, dass ich Unterschiede in Bezug auf den eigentlichen Fix erstelle, den ich schließlich finde: Protokollierung, Debuggen von Variablen, ein fehlgeschlagener alternativer Ansatz usw. Ich denke, es ist einfacher, das Chaos an Ort und Stelle zu lassen, nur den einzeiligen Fix festzuschreiben und dann den Fehler wegzublasen gesamter Index.
pkamb
0

Anscheinend haben Sie ein lokales Repository auf Ihrem Computer und ein Repository, das für Ihre Mitarbeiter auf einem Server freigegeben ist. Warum haben Sie nur ein Repository auf Ihrem lokalen Computer? Normalerweise habe ich mindestens fünf, sodass ich in einem Repository an einer Sache arbeiten, einen Fehler in einem anderen beheben kann, ohne das erste Repo zu berühren, das möglicherweise unvollständig ist, und so weiter.

gnasher729
quelle