Ist es in Ordnung, Zwischen-Commits zu unterbrechen, solange das endgültige Commit in einem Push funktioniert?


13

Verwandte: Sollte jeder GIT das Projekt in einem funktionierenden Zustand belassen?

Angenommen, ich mache lokal die folgenden Commits:

  • Ändern Sie das Datenbankschema und brechen Sie die Anwendung ab.

  • Aktualisieren Sie die Anwendung, damit sie wieder mit dem Datenbankschema kompatibel ist.

Solange ich beide Commits drücke, masterbleibt es in einem funktionierenden Zustand. Eine historische Version ist jedoch defekt.

Mir ist bewusst, dass ich es verwenden kann, git rebase -ium die Commits zusammenzudrücken. Das resultierende Commit ist jedoch umfangreich und weniger aussagekräftig. Wenn ich den Commit-Verlauf durchsuchen muss, um herauszufinden, warum ich etwas geändert habe, ist es mir lieber, wenn der ursprüngliche Commit anzeigt, was ich getan habe und warum.

Meine Fragen sind:

  • Hat jemand Schwierigkeiten aufgrund gebrochener historischer Verpflichtungen in Master gestoßen ?

  • Wenn ja, gibt es eine einfache Möglichkeit, solche Schwierigkeiten zu vermeiden, ohne einzelne Commit-Nachrichten und Änderungen zu verwerfen?


1
Warum können Sie nicht beide Änderungen in einem Schritt festschreiben? Sollen Sie nicht bedeutungsvolle Arbeitsstücke begehen?
Giorgio

Antworten:


9

Es hängt weitgehend von der Verzweigungsstrategie Ihres Outfits ab, aber ich denke, dass es im Allgemeinen eine Menge Sinn macht, unterbrochene Commits in Entwicklungszweigen zu haben - der große "Gewinn" bei der Verwendung der Quellcodeverwaltung besteht darin, kleine Änderungen rückgängig zu machen, und manchmal sind Sie es auch Wenn du ein paar davon machst, musst du Eier brechen, um Omeletts zu machen.

Die einfache Möglichkeit, die einzelnen Commits zu erhalten, ohne den Master zu verschmutzen, besteht in der Verwendung von Zweigen. Sie können das brechende / experimentelle Zeug dort hineinlegen, so dass Sie eine feinkörnige Geschichte haben können, ohne die Geschichte des Hauptzweigs zu verschmutzen.


3
Ja, aber wenn ich ein Feature in Master zusammenführe und es ein schneller Vorlauf ist, hat Master jetzt alle diese Commits. Wenn es sich um viele Commits handelt, sollte ich in Betracht ziehen, die --no-ffOption zum Zusammenführen zu verwenden, um zu erzwingen, dass ein Merge-Commit ausgeführt wird?
Joey Adams

Ich halte es für ein vernünftiges Ziel, dass jedes Commit in der Master-Branche eine funktionierende Softwareversion erzeugt. Wenn es keinen Sinn macht, sie in eine große zu rollen, sollten die Commit-Kommentare alle Abhängigkeiten zu anderen Commits klar beschreiben.
Mattnz

Ich bin der Meinung, dass diese "gebrochenen Commits" gut sind. Wenn Sie einen Fehler haben, den Sie in Ihrer Implementierung nicht gesehen haben, können diese "fehlerhaften Festschreibungen" Ihnen eine sehr spezifische Speicherauffrischung für das geben, was Sie geändert haben. Manchmal ist es nur der Hinweis, den Sie brauchen.
RobotHumans

3
Ein bisschen zu spät zur Party, aber wenn Sie diese unterbrochenen Commits wirklich nicht mögen, sollten Sie einen Neustart durchführen, bevor Sie Ihre Filiale in master zusammenführen.
Dan Pantry

3

Unterbrochene Commits sind etwas, das "einfach passiert" und nicht das Ende der Welt bedeuten sollte. Ich habe eine kleine, nörgelnde Stimme im Hinterkopf, die mir sagt, dass man gebrochenen Code aus Prinzip nicht wissentlich einchecken und daher historische Versionen mit einbeziehen sollte, aber es ist nichts, worüber ich in den Krieg ziehen würde.

Das viel gelobte Verzweigungsmodell von Git macht es möglich, unterbrochene Commits von bestimmten Zweigen fernzuhalten, z. B. wenn Ihr Team gitflow oder eine vereinfachte Version davon verwendet. Alles mit einer "Clean Master" -Richtlinie. In diesem Fall können Sie die endgültige, funktionierende Version als Merge-Commit einchecken, wobei die (beschädigten) Verlaufsversionen im Repository verfügbar sind, jedoch nicht in der Hauptzeile.

Wenn Ihr Team ein solches Verzweigungsmodell nicht übernommen hat, haben Sie eine gute Ausrede, um einfach das ganze Los zu meistern und damit fertig zu werden.


3

Nein, das ist nicht in Ordnung.

Wenn Sie jemals eine git bisect(und wer diese Killer-Funktion nicht liebt) gemacht haben, wissen Sie, welchen Wert eine Historie hat, in der jedes Commit aufgebaut wird.

Wenn Sie während eines bisectnicht erstellten Commits viele Commits haben, haben Sie viele git bisect skip, die es schwierig machen, das letzte gute Commit zu finden.

Wenn Sie eine Feature-Verzweigung fertig stellen und in der Master-Verzweigung zusammenführen, bereinigen Sie die Verzweigung vor dem Zusammenführen, damit Ihr Verlauf übersichtlich und aufbauend ist.


3

Hat jemand Schwierigkeiten aufgrund gebrochener historischer Verpflichtungen in Master gestoßen?

Ja. Backports, Reverts und Bisects sind schwerer. Lesen Sie also die Geschichte (siehe unten).

Wenn ja, gibt es eine einfache Möglichkeit, solche Schwierigkeiten zu vermeiden, ohne einzelne Commit-Nachrichten und Änderungen zu verwerfen?

Nicht, dass ich es wüsste, obwohl Branchen eine anständige Lösung sind.

Ich halte es jedoch für richtig, die einzelnen Commits zu verwerfen (oder eher zu quetschen).

Während der Entwicklung, insbesondere bei TDD, ist es gut, früh und häufig zu beginnen. Sie möchten den vollständigen Überblick über das, was Sie tun, damit Sie zurückverfolgen oder genau herausfinden können, wann etwas schief gelaufen ist (oder sich in ein Refactoring gestürzt haben, das größer ist, als Sie kauen können). Commit away.

Sobald ein Feature / eine Änderung jedoch zum Pushen bereit ist, handelt es sich bei einem Commit um eine verpackte Änderung - im Idealfall um eine atomare Änderung, die so unabhängig wie möglich von anderen Änderungen [überprüft, neu basiert, zusammengeführt, ausgewählt, zurückgesetzt, mit Anmerkungen versehen] werden kann .

Mit Blick auf die Historie eines Projekts sollte eine Softwareänderung eigenständig ausgewertet werden. Baut es? Kommt es mit Tests? Funktioniert es? Was tut es? Welche Dateien mussten geändert werden, um diese Funktion bereitzustellen?

Das Zusammenstellen von Commits ist zwar möglich (und wird durch Zusammenführungen unterstützt), erschwert dies jedoch. Aus diesem Grund halte ich es für angemessen, Ihren Verlauf vor dem Pushen zu bereinigen, auch wenn es bedeutet, den Überblick darüber zu verlieren, wie Sie dort angekommen sind, wo Sie sich gerade befinden.


1

Kurze Antwort: Ja

Testen:

Testgetriebene Entwicklung bedeutet, dass Sie Tests schreiben, die brechen (dh fehlschlagen).
Dann schreiben Sie den Code, damit die Tests funktionieren.

Entwicklung:

Engagieren Sie sich klein, engagieren Sie sich oft.
Jedes Commit ist ein Rollback-Punkt. Wenn Sie feststellen, dass Sie sich auf dem falschen Weg befinden, können Sie relativ einfach zu einem vorherigen Punkt zurückkehren. Wenn Ihre Commits feinkörnig genug sind, können Sie zum richtigen Punkt zurückrollen.

Vorbehalt:

Dies gilt nicht Mittelwert

1) Sie checken den fehlerhaften Code in den Master ein.
2) Sie müssen alle Micro-Commits aktivieren, damit alle sie überprüfen können.

Verwenden Sie Zweige, um Ihre Arbeit zu erledigen. Komprimieren Sie potenziell Micro-Commits für die Überprüfungsprozesse, sodass sie in logisch getrennten Einheiten mit entsprechenden Kommentaren vorliegen. Wenn Sie git verwenden, verlieren Sie nicht den ursprünglichen Commit-Satz. Sie können einfach einen neuen, logischeren Commit-Satz für die Überprüfungsprozesse erstellen, die in master zusammengeführt werden.


0

Ich denke, solange die Commits lokal sind und nicht an andere weitergegeben werden, ist das nicht nur in Ordnung, es ist auch eine gute Art zu arbeiten. Übertragen Sie gebrochenen Code einfach nicht an andere.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.