Hör auf zu kopieren, es ist Zeit zum Zusammenführen. Teil 2. Ein Zusammenführungskonflikt, der nie stattgefunden hat (aber hätte sein sollen)

Das letzte Mal haben wir gesehen, wie das Ändern des Codes in einem kopierten Commit die Gefahr eines Konflikts erzeugt, der ruhig bleibt, bis beide Kopien irgendwo zusammengeführt werden, was in sehr ferner Zukunft passieren kann. Aber wissen Sie, was ist schlimmer als ein Zusammenführungskonflikt?







Das Fehlen eines Konflikts.







Kehren wir zur alten Situation zurück:







erster Baum







Stellen wir uns vor, dass der Zweig "Feature" schon lange existiert und regelmäßig zu "Master" zusammengeführt wird. Das Diagramm zeigt eine Momentaufnahme des Baums unmittelbar nach der letzten Zusammenführung A. Wir arbeiten an einem Sprint in "Feature" voller neuer Funktionen.







Angenommen, die Zeile "Apfel" befindet sich in der Einstellungsdatei, die einige Funktionen steuert. Beide Zweige schreiben Commits M1 und F1 fest, die diese Datei nicht berühren.







Stellen wir uns nun vor, wir haben einen schwerwiegenden Fehler in einer alten Funktion gefunden, der das Verhalten des gesamten Programms vollständig zerstört. Wenn wir das Problem abrupt beenden, schalten wir die Funktion aus, indem wir die Zeile in "Berry" ändern und die Änderungen als F2 festschreiben.







Im Leben wird so etwas wie das Ändern der Linie c passieren







#define IS_FEATURE_ENABLED 1
      
      





auf







#define IS_FEATURE_ENABLED 0
      
      





Aber da ich angefangen habe, "Apfel" und "Beere" zu verwenden, lassen Sie sie so bleiben.







, , , "master". , , , .







"master", "feature", .







, "master" . , F3 "feature" . :







Fehler behoben







"berry" M3 "master". "feature" "apple" F3.







"feature" "master" . :







Hoppla







M4, "berry". "master" ! , "master" : , . , . , "feature", "master" .







, .







:







Vor dem Zusammenführen







Git (merge base): , . Git - (three-way merge), , M3 HEAD, F3 . , :







einfach







"master" "apple" "berry". "feature" . "apple" "feature", "master" . "master" "berry" .







, "master" "feature", "berry" "feature":







falsch







, . ( ) "apple", "feature" , "berry" "master". , (fast-forward) .







" , ", . , , , .







Wenn Sie vorsichtig genug sind, um die in der Kopie enthaltenen Zeilen nicht zu berühren, werden die Erwartungen wahr. Andernfalls werden die Änderungen nicht zusammengeführt, sondern überlagert. Schlimmer noch, wenn Ihre Änderungen die kopierten rückgängig machen, erhalten Sie nicht einmal einen Zusammenführungskonflikt, um zu zeigen, dass etwas nicht stimmt. In unserem Team nennen wir dies das ABA-Problem, weil zuerst enthielt die Zeile A, dann wurde sie in B geändert, B wurde kopiert und dann kurz vor dem Zusammenführen in "master" zu A zurückgeführt.







Kurz gesagt, wir wollten eine teilweise Zusammenführung von "Feature" zu "Master" durchführen, aber das Problem ist, dass es keine "teilweise" Zusammenführung gibt.







Oder ist da?







Im nächsten Artikel werde ich Ihnen zeigen, wie es geht.








All Articles