Sind häufige komplizierte Zusammenführungskonflikte ein Anzeichen von Problemen?


35

In unserem Team verwenden wir Git als Quellcodeverwaltung. Wir haben mehrere Codebereiche, die fast unabhängig sind, sich jedoch teilweise überschneiden. In letzter Zeit haben wir Workflows und Ansätze zur Verwendung der Quellcodeverwaltung erörtert. Eine Beschwerde, die auftritt, wenn ich die Verwendung eines Feature-Branch-Workflows bewerbe, ist, dass Personen häufig auf komplizierte Zusammenführungskonflikte stoßen, die sie falsch lösen. Mit "kompliziert" meine ich "nicht offensichtlich, wie es gelöst werden soll". In Anbetracht dessen werden andere Workflows aktiver genutzt, beispielsweise ein auf Pull Rebase basierender Workflow.

Als Befürworter des Feature-Branch-Ansatzes erhalte ich die Beschwerde nicht wirklich. Ja, Sie müssen Ihre lokalen Feature-Zweige von master oder wo auch immer auf dem neuesten Stand halten, aber das ist ungefähr das einzige wirkliche Problem, das ich sehe. Ich denke, wenn Ihre Zusammenführungen immer kompliziert sind und Sekundäreffekte haben können, dann ist das eher ein Teamwork-Problem als ein Git-Problem.

Habe ich recht, wenn ich das denke? Sind komplizierte Zusammenführungskonflikte ein Zeichen für etwas Gutes oder Schlechtes?


1
Wie lange halten Features? Wie gut ist der Code modularisiert? Könnten Sie (zum Beispiel) im Testcode Commit auswählen (wurde zuerst ausgeführt und vom eigentlichen Code getrennt, richtig?), Um zu sehen, wie sich die Funktionalität geändert hat?

@MichaelT Die Codebasis ist für unsere automatisierte Testcodebasis. Wir werden mit der Arbeit an einer neuen Erweiterung unseres Projekts beginnen, die wahrscheinlich eine gewisse zeitgleiche Entwicklung erfordern wird. Daher die Diskussion von Feature-Branches gegen andere.
Joshin4colours

7
Stoßen die Leute tatsächlich auf diese Art von Problem oder befürchten sie nur, dass diese Probleme auftreten könnten?
Christopher Creutzig

2
Übrigens AWESOME Tutorial, das Sie verlinkt haben :)
Vorac

1
Das erneute Reduzieren des Feature-Zweigs oder das Zusammenführen mit dem Trunk führt zu ähnlichen Zusammenführungen. Das erneute Reduzieren führt tatsächlich zu mehr Verschmelzungen und führt daher mit größerer Wahrscheinlichkeit zu schlechten Konflikten. Was zählt ist, wie oft es gemacht wird.
Jan Hudec

Antworten:


23

Es ist nicht unmöglich, dass das Problem Ihr Code ist. Wenn Ihre Codebasis viele Beziehungen zwischen Modulen hat, wird jede Änderung überall Ranken haben und jeder Entwickler interagiert mit dem Code eines anderen, es wird ein Albtraum.

Ich würde eher denken, dass Sie dies zuerst auf andere Weise bemerken würden, aber es ist möglich, dass Sie so daran gewöhnt sind, dass Sie es nicht mehr sehen können.


9
Das war mein erster Gedanke. Komplizierte Zusammenführungskonflikte treten auf, wenn am selben Code mehrere Änderungen vorgenommen werden. Wenn Sie ein relativ junges Projekt haben, ist dies häufig der Fall, aber wenn Sie eine gute Codebasis haben, kann dies ein Zeichen für "Gottobjekte" sein oder dafür, dass einige Module / Klassen zu viel tun und überarbeitet werden müssen. Es kann auch von übereifrigen Spielern ausgehen, die Dutzende kleiner Änderungen vornehmen, aber das ist weniger verbreitet.
TMN

1
Die Tatsache, dass unsere Codebasis etwas "jung" ist (ca. 6 Monate alt, durch mehrere große Refaktoren gegangen), könnte ein Indikator dafür sein.
Joshin4colours

10
@ joshin4colours Wenn Sie überarbeiten, während jemand ein großes Feature schreibt, haben Sie Probleme.
Sean McSomething

17

Ich bin an den Workflow "Fetch-Rebase-Push" gewöhnt. Welches ist eigentlich der erste, primitivste Workflow, der in Ihrem Tutorial beschrieben wird? Hier sind die Vorteile:

  • Echte kontinuierliche Integration
  • Frühes Konfliktmanagement - gleich nachdem man den Code geschrieben und getestet hat
  • Schnelle Antwort - "- Hey, Bob, die kubische Interpolation, die du geschrieben hast, gibt eine lustige Ausgabe. Könntest du sie dir ansehen, während ich beim Mittagessen bin?"
  • Keine Merge-Commits - saubere Timeline, als ob ein Entwickler jemals etwas geschrieben hätte

Nun zu komplizierten Zusammenführungskonflikten. Ich verstehe nicht, wie man sowohl häufige als auch komplizierte Verschmelzungen erleben kann . Komplikationen entstehen dadurch, dass man lange Zeit nicht mehr rebasiert / kirscht und einen Monat lang an dieser Funktion arbeitet.

Ich persönlich würde es vorziehen, mit häufigen, einfachen Zusammenführungskonflikten (eigentlich Rebase-Konflikten) umzugehen, anstatt mit seltenem, allumfassendem Zusammenführungshorror.


1
Tolle Beschreibung eines guten Git-Workflows, aber das beantwortet meine Frage nicht ganz.
Joshin4colours

2
@joshy das ist wahr. Nur der mittlere Absatz behandelt Ihre Frage. Aber hier ist eine direkte Antwort. Wenn das Zusammenführen häufig und schwierig ist, ist dies sicherlich ein Hinweis auf ein problematisches Workflow- / Kommunikations- / Architektur- / Aufteilungsproblem oder das Rollenproblem.
Vorac

7

Zusammenführungen und Neuzusammenlegungen sollten genau dieselben Konflikte verursachen wie die Konflikte, die ein Mensch lösen muss (dh zwei Entwickler, die dieselbe Codezeile ändern). Bei anderen Konflikten sind Zusammenführungen in der Regel sauberer, da Sie die SHA-1 von Commits nicht überall ändern. Ich bin mir nicht sicher, wie Sie es schaffen, in einen Zustand zu gelangen, in dem Zusammenschlüsse mehr Konflikte verursachen als Rebases, aber es ist sicherlich ein Zeichen dafür, dass der Workflow einiger Leute durcheinander ist und sie wahrscheinlich mehr Schulung benötigen, wie Git funktioniert. Entfernen sie die Merge Commits anderer Leute, wenn sie ihre lokalen Rebases durchführen, oder so ähnlich?

Der Vor- und Nachteil der Pull-Rebase-Methode ist, dass sie zentralisierten Workflows sehr ähnlich ist, an die viele Menschen gewöhnt sind. Sie müssen die Verzweigung nicht verstehen, um sie zu verwenden.

In jedem Fall ist es durchaus möglich, einen Feature-Branch-Workflow nur lokal durchzuführen, wenn Sie andere Personen nicht dazu bringen können, sich anzumelden.


5

Das Projekt, an dem ich arbeite, hat von Zeit zu Zeit diese Art von Problem und es scheint sich aus ein paar Faktoren zu ergeben:

  • Wir verwenden Visual Studio und Dateien wie das Visual Studio .sln sind nur XML-Dokumente (die nicht gut auf Zusammenführungen von Texten reagieren) voller Guids (die Git nicht besser verstehen kann als der Rest von uns) und können es leicht sein schlecht zusammengeführt und dazu führen, dass Dateien verloren gehen.
  • Einige Leute arbeiten an ähnlichen Bereichen des Codes, so dass die Änderungen in Klassen direkt nebeneinander vorgenommen werden können. Obwohl dies in dieser Situation unvermeidlich ist, wird diese Art der Konfiguration für jedes Versionsverwaltungssystem eine harte Arbeit sein. Selbst wenn Sie eine gute Kommunikation in Ihrem Team haben, werden die Leute manchmal nicht bemerken, dass sie sich gegenseitig anstoßen und Konflikte entstehen.

Ich bin an dem Potenzial von Semantic Merge interessiert , bei einigen dieser Probleme Abhilfe zu schaffen, aber das nützt natürlich nur, wenn Sie in einer Sprache arbeiten, die es analysieren kann, und wenn ich Ich benutze es, daher kann ich nicht für seine Wirksamkeit bürgen.


4

Sofern Entwickler historische Festschreibungen nicht ändern (anstelle von reinen Zusammenführungen), sind die Konflikte in einem Git-Modell vom Typ Feature-Workflow ein Zeichen für eine eng gekoppelte Codebasis (/ brandneue Codebasis) oder eine überlappende Feature-Zuweisung.


0

Sie haben einen Hauptzweig (Master) und jeder arbeitet in seinem Feature-Zweig.

Die Arbeit in den Feature-Zweigen kann einige Stunden bis einige Monate dauern.

Von Zeit zu Zeit führt jemand sein Änderungsset zurück in den Hauptzweig. Ihr Teamleiter muss sicherstellen, dass jeweils nur eine Person die Zusammenführung rückgängig macht. Sobald dies geschehen ist, müssen Sie die Zusammenführung vom Hauptzweig in Ihren Feature-Zweig weiterleiten. Sobald jeder eine Vorwärtszusammenführung ausführt, kann es einer anderen Person gestattet werden, die Zusammenführung in den Hauptzweig rückgängig zu machen. Andernfalls werden zu viele Änderungen rückgängig gemacht und es kommt zu unzähligen Zusammenführungskonflikten bei der Vorwärtszusammenführung.

Um die Terminologie zu verdeutlichen, meine ich mit "Zusammenführen umkehren" das Zusammenführen vom Feature-Zweig zum Hauptzweig und mit "Zusammenführen umkehren" das Zusammenführen vom Hauptzweig zum Feature-Zweig. Aufgrund meiner bisherigen Erfahrungen ist es wahrscheinlich, dass bei der umgekehrten Zusammenführung mehr Zusammenführungskonflikte auftreten als bei der Vorwärtszusammenführung.


1
Das Zusammenführen in den Hauptzweig darf niemals zu Konflikten führen. Sie führen main immer zuerst mit feature zusammen, sodass feature to main dann konfliktfrei ist.
gnasher729

@ gnasher729 - Ich denke , das sagt diese Antwort - aus meiner Sicht lautet der Vorschlag, dass jeder Entwickler jedes Mal, wenn jemand etwas für main festlegt, von main zu seinen Feature-Zweigen verschmilzt, sodass alle Konflikte in den Feature-Zweigen sofort gelöst werden.
Periata Breatta

Er sagte: "Es ist wahrscheinlicher, dass Konflikte von Feature zu Master verschmelzen"
gnasher729

0

Zwei Dinge, die helfen können: Erstens: Vermeiden Sie Tools, die eigenständig Änderungen vornehmen. Zwei Entwickler, die unterschiedliche Registerkarteneinstellungen verwenden, sind ein Rezept für eine Katastrophe. Zweitens, nehmen Sie Änderungen an verschiedenen Orten vor. Ein Problem tritt beispielsweise auf, wenn drei Entwickler Code am Ende derselben Datei hinzufügen - viel besser, wenn sie Code an verschiedenen Stellen hinzufügen.

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.