Wie wird ein laufendes Refactoring durchgeführt?

23

Ich habe also dieses große Projekt, das gerade von mir überarbeitet wird. Ich ändere eine Menge Dinge, daher gibt es keine Chance, dass sie bald kompiliert werden. Ich lebe in einem speziellen Git-Zweig, den ich benannt habe cleanup( masterder natürlich irgendwann zusammengeführt wird).

Das Problem ist, dass ich / wir die Richtlinie haben, niemals nicht kompilierten Code zu schreiben (idealerweise sollte es auch funktionieren, aber es muss zumindest kompiliert und verlinkt werden). Also, bis ich mit dieser riesigen Aufgabe fertig bin, kann ich nichts mehr festlegen (für die Überprüfung oder für die Buchhaltung).
So arbeite ich nicht gerne (ich glaube, die meisten Leute verpflichten sich mindestens einmal am Tag oder so).

Was denkst du? Gibt es eine Lösung, die ich übersehen habe?
Kann ich git später anweisen, Commits zusammenzufassen oder so? Ich könnte mit nicht kompiliertem Commit leben, solange sie in der Filiale bleibencleanup .

Bearbeiten

Zum Thema Pushing / Committing: Ich bin mir bewusst, dass es ein großer Unterschied ist, aber später wird es zu fehlerhaften Überarbeitungen kommen, wenn ich meine Inhalte zusammenführe master. Wenn Sie also durch den Verlauf blättern (oder git bisect...), sind die "lokalen" Revisionen weltweit zugänglich. Daher ist es nicht die beste Lösung, sich nur lokal zu verpflichten und nicht zu pushen, da dies später zu Problemen führen kann (wenn das Thema für einige Zeit geschlossen und vergessen ist).

Kurz gesagt: Lokale Commits werden irgendwann verschoben. In der globalen Historie sollten keine nicht kompilierten Commits angezeigt werden.

Bitmaske
quelle
1
Sie können mehrere lokale Commits in einem einzigen globalen Commit sammeln.
@ Thorbjørn ist das Jims Empfehlung unten oder ein anderer Mechanismus innerhalb von Git?
Brian
Ich glaube schon - ich kann mich nicht an den genauen Befehl erinnern.
5
Sie überarbeiten nicht, Sie tun etwas Größeres. Nach jedem Refactor auf einer Codebasis sollte Ihr Code kompiliert werden und genau dasselbe beobachtbare Verhalten aufweisen. Vielleicht möchten Sie Ihren Fragentitel ändern, um dies widerzuspiegeln, da meine unmittelbare Reaktion lautete: "Legen Sie fest, was Sie haben, wann immer es funktionieren sollte".
David Thornley
1
@bitmask Wie wäre es mit einem Umschreiben?
Dave Hillier

Antworten:

21

Mit dem git merge --squashBefehl können Sie ein einzelnes Festschreiben über dem aktuellen Zweig erstellen, dessen Wirkung dem Zusammenführen eines anderen Zweigs entspricht. Der Befehl aktualisiert den Arbeitsbaum und bereitet die Änderungen im Index vor, sodass Sie als Nächstes nur noch Folgendes ausführen müssen:

git checkout master
git merge --squash cleanup
git commit -m "Merge cleanup branch"

Der git rebase -iBefehl kann auch Squash-Commits ausführen, erfordert jedoch mehr Arbeit.

Jim Huang
quelle
14

Ein Rewrite ist kein Refactoring

Mir ist klar, dass Sie an der Verwendung von Git interessiert sind, aber ich würde argumentieren, dass Sie überlegen sollten, die Art und Weise, wie Sie Refactorings durchführen, mehr zu ändern als die Art und Weise, wie Sie Git verwenden (obwohl ich denke, dass Git Ihnen helfen kann).

Martin Fowler definiert Refactoring als :

Eine disziplinierte Technik zur Umstrukturierung eines vorhandenen Code-Körpers, wobei die interne Struktur geändert wird, ohne dass das externe Verhalten geändert wird.

Sein Herz ist eine Reihe von kleinen Verhaltensweisen, die Transformationen bewahren. Jede Transformation (als „Refactoring“ bezeichnet) bewirkt wenig, aber eine Abfolge von Transformationen kann zu einer erheblichen Umstrukturierung führen. Da jedes Refactoring klein ist, ist es weniger wahrscheinlich, dass es schief geht. Das System wird nach jeder kleinen Umgestaltung voll funktionsfähig gehalten, wodurch die Wahrscheinlichkeit verringert wird, dass ein System während der Umstrukturierung ernsthaft beschädigt wird.

Wenn Sie diese Methode anwenden, können Sie regelmäßig einen Commit (und einen Push) ausführen.

Sie könnten argumentieren, dass dies unpraktisch ist und dass es für etwas Großes nicht funktioniert. Hier kann die Mikado-Methode helfen. Sie zerlegen ein großes Refactoring in eine Reihe kleiner Refactorings, indem Sie ein Abhängigkeitsdiagramm erstellen. Die Methode ist rekursiv. Versuchen Sie, Ihre Änderung vorzunehmen. Es wird nichts eingebrochen. Andernfalls machen Sie Ihre Änderung rückgängig und notieren sich die Voraussetzungen. Nacheinander beheben Sie die erforderlichen Refactorings, bis Sie Ihr Hauptziel für das Refactoring erreicht haben.

Git kann dieser Methode wirklich helfen. Sie können Ihren lokalen (defekten) Zweig behalten. Während Sie die Unterziele festlegen (und verschieben), können Sie zu rebaseIhrem Hauptziel über die soeben festgelegten Festschreibungen hinaus verzweigen, bis es nicht mehr unterbrochen wird.

Dave Hillier
quelle
5

Schauen Sie sich die Handbuchseite an git rebase, insbesondere die git rebase -iVariante. Sie können beliebig viele Commits in Ihrem Verlauf nachbestellen, löschen oder zusammenpressen. Das hört sich nach dem an, wonach Sie suchen. Ich benutze es die ganze Zeit in genau der Situation, die Sie beschreiben: Machen Sie viele kleine Commits, die nicht für den öffentlichen Verbrauch geeignet sind, und fassen Sie sie dann zu einem einzigen "Refactoring" -Commit zusammen, bevor Sie sie in das gemeinsam genutzte Repository verschieben.


quelle
3

Sie verwenden Git, so begehen bedeutet nicht unbedingt , drängen Sie Ihre Änderungen ....

IMHO, und wenn Sie mit Git arbeiten, ist es perfekt, Ihre Arbeit festzuschreiben, auch wenn sie nicht kompiliert wird. Denn nachdem Sie Ihre Änderungen festgeschrieben haben, wird niemand den Code zur Verfügung haben (bis Sie ihn pushen). Natürlich müssen Sie vor dem Pushen sicherstellen, dass es einwandfrei funktioniert und kompiliert wird, damit andere Ihre Änderungen problemlos abrufen und zusammenführen können.

Außerdem arbeiten Sie an einem anderen Zweig als dem Hauptzweig. Also, wenn Sie wollen (und ich empfehle dies), werden Sie Ihre Niederlassung nie schieben. Sobald Sie das Refactoring abgeschlossen haben, checken Sie einfach den Master-Zweig aus, führen Ihre Änderungen zusammen und drücken den Master-Zweig.

Bearbeiten

In diesem Fall können Sie verwenden git cherry-pickoder damit herumspielengit rebase

Cristian
quelle
Ein wichtiger Hinweis, den ich mir aber überlegt habe. Bitte sehen Sie meine Bearbeitung. Vielen Dank.
Bitmaske
Siehe meine Bearbeitung oben.
Cristian
Ich würde -1, wenn ich könnte; Die Commits werden verfügbar! Lokale Work-in-Progress-Commits sind großartig, aber sie werden niemals forciert. Es erschwert das Verständnis von Code, unterbricht die Git-Halbierung und verkompliziert den Verlauf. Rebase oder Squash statt.
RJFalconer