Beheben von Zusammenführungskonflikten aufgrund von Refactoring


13

Ich habe kürzlich eine Diskussion darüber geführt, wie man mit Refactoring im Allgemeinen umgeht (was an sich schon ein interessantes Thema ist). Schließlich wurde folgende Frage aufgeworfen:

Wie geht man mit Zusammenführungskonflikten um, die dadurch entstanden sind, dass jemand einen Teil des Codes umgestaltet hat, während ein anderer an einem Feature für denselben Code gearbeitet hat?

Grundsätzlich habe ich keine Ahnung, wie ich effizient damit umgehen soll. Gibt es Best Practices, die man diesbezüglich befolgen sollte? Gibt es einen Unterschied, wie man mit einem System mit Tonnen von Legacy-Code umgehen sollte?


Ich habe eine ähnliche Frage, aber mit unterschiedlichen Anforderungen, also habe ich eine andere Frage hinzugefügt. programmers.stackexchange.com/questions/109229/…
Roger CS Wernersson

Antworten:


9

Gute Frage. Die beste Strategie, die ich mir vorstellen kann, ist:

Verhütung

Eine Kombination aus kontinuierlicher Integration und häufigem Ausführen kleiner Refactorings (anstelle gelegentlicher großer Refactorings) trägt erheblich dazu bei, die Kosten und die Häufigkeit solcher Konflikte zu minimieren.


3

Ich denke, um Ihre Frage zu beantworten, müssen wir zuerst sehen, warum Konflikte auftreten und was die wahre Bedeutung und der wahre Prozess der Verschmelzung ist.

Konflikte treten nur dann , wenn zwei oder mehr Entwickler auf der Arbeits gleiche Datei an der gleichen Zeit und dann beide versuchen sie zu lesen. Der erste Entwickler wird keinen Konflikt erhalten, natürlich. Aber die zweite (dritte, vierte und so weiter) würde Konflikte bekommen. Warum, weil er einen Code hat, der sich teilweise oder vollständig von dem auf dem Server vorhandenen Code unterscheidet.

Dies bedeutet, dass der zweite Entwickler etwas anderes im Sinn hat als der erste Entwickler. Dieser Unterschied kann vom Stil abweichen, beispielsweise von der Verwendung new UserManager().GetUserName()anstelle der von UserManager userManager = new UserManager(); userManager.GetUserName();Ihnen angegebenen Stufe, was bedeutet, dass beide Entwickler unterschiedliche Ideen hatten, wie der Code umgestaltet werden kann, um ihn zu verbessern.

Das Zusammenführen bedeutet jedoch nicht, dass Entwickler ihren Code einchecken können, ohne Konflikte zu berücksichtigen. Sie sollten und müssen diese Konflikte angehen. Wenn Konflikte nicht wichtig sind, können sie den vorherigen Code einchecken und überschreiben. Wenn sie jedoch etwas völlig anderes sehen, sollten sie den vorherigen Entwickler anrufen und mit ihm sprechen, damit beide zusammen koordiniert werden können, um die beste Lösung einzuchecken.

Wenn Sie beispielsweise zwei Entwickler bitten, die Online-Zahlungsbibliothek zu verbessern , und deren Arbeit sich überschneidet, bedeutet dies, dass es zumindest an einigen Stellen zwei verschiedene Lösungen gibt. Daher sollte eine dieser Lösungen besprochen und als bessere Lösung akzeptiert und eingecheckt werden.

Ich bin nicht damit einverstanden , diese Umstände zu verhindern, da wir dazu neigen sollten, realer als theoretisch zu sein. Manchmal beherrscht ein Typ CSS wirklich gut, während ein anderer ASP.NET Markup wirklich gut beherrscht. Ihre Arbeit kann jedoch zu Konflikten führen, wenn sie beide auf der Anmeldeseite arbeiten sollten, damit sie funktioniert. Ich meine, wenn wir real denken (nicht ideal), können wir sehen, dass dieses Phänomen (Konflikt) oft auftritt.

Ein weiterer Punkt, den ich nur erwähnen wollte, ist die Verwendung von Tools, die Ihnen beim Einchecken helfen. Diese Tools veranschaulichen normalerweise den Unterschied zwischen Servercode und Entwicklercode und helfen bei der Bestimmung, welcher Teil eingecheckt werden soll.


3

Wenn keine aktive Aufgabenverwaltung vorhanden ist, treten Konflikte auf.

Wenn Sie jedoch eine tägliche Besprechung oder einen Manager haben , kann dieses Problem möglicherweise nicht auftreten.

Entweder sprechen Sie (über ein tägliches Aufstehen) oder sprechen Sie mit einem Manager.

Dies wird durch Sprechen trivial verhindert.


+1. Einige Entwickler sehen Manager als Hindernis. Es gibt jedoch Manager, die es anderen ermöglichen, zu arbeiten , und dies ist ein hervorragendes Beispiel für ein Problem, bei dem sie helfen können.
MarkJ

@MarkJ: Ein Manager, der ein Hindernis für das Zusammenführen von Konflikten darstellt, ist keine schlechte Sache. Hervorragender Punkt.
S.Lott

+1 Ich wollte gerade so etwas zu meiner Antwort hinzufügen, aber du hast es geschafft. Wenn Sie einen Konflikt verwenden, um zu wissen, dass eine andere Person in demselben Bereich gearbeitet hat, werden Sie dies erst spät im Spiel herausfinden und müssen sich dann damit befassen. Durch Aufgabenverwaltung und -kommunikation können Entwickler, die in demselben Bereich arbeiten, von Anfang an zusammenarbeiten .
Gyan aka Gary Buyn

1

Haben Sie einen separaten gemeinsamen Zweig für die Entwicklung einer bestimmten Funktion, führen Sie diese häufig zusammen, ziehen Sie sie und drücken Sie sie - fertig.

Und kommunizieren . Sprechen Sie bereits beim Start mit anderen Entwicklern über Code. Auch beim Codieren)))


1

Stellen Sie sicher, dass die Zusammenführung so einfach wie möglich ist. Refactoring ist in der Regel ein eher mechanischer Prozess, der viele vorhandene Zeilen ändert : Verschieben von Variablendeklarationen, Leerzeichenänderungen, Formatierung, Abfolge von Vorgängen. Die Erstellung von Features ist in der Regel ein weitaus kreativeres Unterfangen, das häufig zu einem neuen Code und einigen geringfügigen Änderungen am vorhandenen Code führt. Wenn der Entwickler, der das Refactoring durchführt, die Schritte aufzeichnet (zum Beispiel als reguläre Ausdrücke), kann es viel einfacher sein, diese mit der zusätzlichen Funktionalität auf den Code anzuwenden, als umgekehrt. Auf dieser Grundlage würde ich sagen, dass Sie in der Regel die komplexeste Änderung zuerst anwenden sollten , gefolgt von immer einfacheren Änderungen.

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.