Ungewolltes Branching in Mercurial

Letzte Änderung am 7. November 2020 by Christoph Jüngling

Sobald mehrere Leute an derselben Sache arbeiten, kann es zu Konflikten kommen. Im Rahmen dieses Artikels soll diese triviale Erkenntnis allerdings nicht den zwischenmenschlichen Aspekt beleuchten. Es sind hier rein technische Konflikte beim Zusammenführen zweier Dateiversionen in Mercurial gemeint.

Wir betrachten hierbei die beiden Kollegen Max und Moritz, die treffenderweise an der Erfassung des gleichnamigen Gedichtes von Wilhelm Busch arbeiten. Leider haben sie sich nicht so recht abgestimmt, wer welche Strophe eintippen soll, so dass es gleich zu Beginn zu einer Überschneidung kommt.

Zunächst beginnt alles ganz harmlos. Max fängt mit dem ersten Streich an, beendet ihn, dann clont Moritz sein Repository. Die Repositories und die Arbeitsverzeichnisse der beiden sehen zu diesem Zeitpunkt noch ziemlich gleich aus (ein Klick auf das Bild vergrößert es):

Bereits jetzt gibt es aber einen Unterschied: Die “Phase” der Changesets zeigt bei Max noch “draft”, weil er diese noch nirgendwohin verteilt hat. Bei Moritz hingegen stehen die Changesets schon auf “public”, denn er hat sie ja von Max gezogen. Dieser Unterschied kommt daher, dass ein “Pull” oder “Clone” niemals die Quelle verändert. Daher bleibt bei Max noch alles beim Alten. Leider hat Moritz seinem Bruder nichts davon gesagt, dass er sein Repository geclont hat, und Max kann das ohne Rücksprache auch nicht sehen.

Nun ist Moritz auf den Geschmack gekommen und beginnt fleißig zu tippen. Max wiederum macht ebenfalls weiter. Leider denken beide, dass nun logischerweise der zweite Streich dran kommt. Wie man sieht, laufen die Arbeiten ab dem Changeset mit der Nummer 4 parallel ab:

Nun kennt Max seinen Bruder allerdings recht gut und denkt sich, ich schaue doch lieber mal nach, was der so in der Zwischenzeit angestellt hat. Max “pullt” also von Moritz dessen Änderungen. Vorher muss er aber noch ermitteln, wo das Repository seines Bruders liegt (hier nur simuliert in einem anderen Ordner). Dies speichert er sich in den “Paths”-Einstellungen seines Repositories ab:

Wegen dieser Situation trägt dieser Artikel den Titel “Ungewolltes Branching”. Und nun hat Max das Problem, die zwei Köpfe (“Heads”) des “default branches” unter einen Hut zu bekommen. Er muss “Mergen”. In seinem Repository betrifft das die Changesets 6 und 9. Max steht mit seinem auch nach dem Pull unveränderten Arbeitsverzeichnis auf Changeset 6. Er wählt Changeset 9 in TortoiseHg aus, klickt Rechts und befiehlt “merge with local”. Im zweiten Schritt bekommt er sofort einen Merge-Konflikt angezeigt:

Für das Mergen, also das Verschmelzen beider Köpfe, gibt es eine Reihe von Programmen und auch verschiedene Vorgehensweisen. Die einfachste (aber meist nicht sinnvolle) wäre, “take local” oder “take other” auszuwählen, um einer der beiden Varianten komplett den Vorzug zu geben. Meistens wird man nur einige wenige Zeilen vergleichen müssen und besonders bei Programmen muss dabei auch der Kontext der Funktion berücksichtigt werden. Wie auch immer Max das nun schafft, am Ende hat er (bzw. sein Repository) nur noch einen Kopf:

Nächste Woche geht es weiter mit der Frage, wie man einen solchen Konflikt manuell auflöst.

Ähnliche Artikel:

Schreibe einen Kommentar

Deine Email-Adresse wird nicht veröffentlicht.

2 × 1 =