External Sync / How to... / Konflikte beheben / Gleichzeitige Änderungen an einer Vorlage / Überlappende Bereiche (Konjunktion)

Gleichzeitige Änderung an einer Vorlage, überlappende Bereiche (Konjunktion)

Inhaltsverzeichnis

In diesem Szenario wird die Vorgehensweise der Konfliktbehandlung illustriert, wenn die gleichzeitige Arbeit an einer Vorlage durch mehrere Entwickler zu unterschiedlichen Änderungen in gleichen Bereichen eines Elements (z. B. dieselbe Zeile wird von jedem Entwickler unterschiedlich abgeändert) der jeweils lokalen Arbeitsversionen der Vorlage führt.

Bei konfliktären Änderungen an überlappenden Bereichen derselben Datei muss der Konflikt außerhalb von FirstSpirit, beim Überführen der lokalen Änderungen in das Git-Repository, vom Benutzer manuell behoben werden. Hierbei muss sich der Benutzer entscheiden, welche Version beibehalten werden soll: diejenige, die zuerst ins Repository übertragen wurde, oder diejenige, die lokal vorliegt.

Ausgangssituation

Im FirstSpirit-Projekt existiert eine Seitenvorlage page_text, dessen Ausgabekanaldefinition „HTML“ folgenden Text enthält:

Zeile 1
Zeile 2
Zeile 3
Zeile 4
Zeile 5

Diese Seitenvorlage ist in den Projektinstanzen beider Entwickler im gleichen Stand vorhanden.

Auftreten des Konfliktfalls

Entwickler A

  1. Modifikation eines FirstSpirit-Elements
    Entwickler A ändert den Inhalt des Ausgabekanals im Seitentemplate page_text:
    Zeile 1
    Zeile 2 A
    Zeile 3
    Zeile 4
    Zeile 5
  2. Export der Änderungen ins Dateisystem
    Entwickler A exportiert per fs-cli den Projektstand ins lokale Dateisystem (Git-Repository)
    fs-cli -p DevProject -sd "D:\Git\DevProject" export templatestore
  3. Änderungen ins Git-Repository überführen
    Entwickler A überträgt die Änderungen ins Git-Repository
    git commit -a -m "changed page_text"
    git push

Entwickler B

  1. Modifikation eines FirstSpirit-Elements
    Entwickler B verändert den Inhalt des Ausgabekanals an derselben Textstelle, die auch Entwickler A verändert hat, gibt aber anderen Inhalt an:
    Zeile 1
    Zeile 2 B
    Zeile 3
    Zeile 4
    Zeile 5
  2. Export der Änderungen ins Dateisystem
    Entwickler B exportiert per fs-cli den Projektstand ins lokale Dateisystem
    fs-cli -p DevProject -sd "D:\Git\DevProject" export templatestore
  3. Änderungen ins Git-Repository überführen
    Entwickler B überträgt die Änderungen ins Git-Repository
    git commit -a -m "export page_text"
    git push

$ git push
To ssh://firstspirit.example/externalsync
! [rejected] myBranch -> ts/sync-test (non-fast-forward)
error: failed to push some refs to 'ssh://fsgit@ssh://test.domain.com/git'
hint: Updates were rejected because the tip of your current branch is behind
hint: its remote counterpart. Integrate the remote changes (e.g.
hint: 'git pull ...') before pushing again.
hint: See the 'Note about fast-forwards' in 'git push --help' for details.

Konfliktlösung

Update

Arbeitsverzeichnis gegen das Git-Repository aktualisieren
Entwickler B bringt die lokale Arbeitsversion auf den Stand des Repositorys:
git pull

Entwickler B erhält nun durch den Git-Client die Meldung, dass ein Konflikt aufgetreten ist: Im Repository ist an einer anderen Stelle der einzucheckenden Datei eine weitere Änderung (von Entwickler A) vorhanden, die in der lokalen Version (aus Projekt B) nicht vorliegt.

Git-Konflikt auflösen

Die Behandlung dieses Konfliktfalls erfordert manuelle Intervention von Entwickler B, da der Git-Client keine Entscheidung treffen kann, welche der beiden Versionen beibehalten werden soll.

Meldung des Git-Client auf der Kommandozeile, z. B.:

CONFLICT (content): Merge conflict in TemplateStore/PageTemplates/page_text/ChannelSource_HTML_html.html
Automatic merge failed; fix conflicts and then commit the result.

An dieser Stelle muss sich Entwickler B entscheiden, welche Version (die in der lokalen Projektinstanz vorhandene oder die bereits durch Entwickler A ins Repository überführte Version) als maßgeblich betrachtet werden soll. Entscheidet er sich z. B., seine eigene Änderung an der Vorlage beizubehalten, dann führt er über den Git-Client ein Checkout aus, welches im Konfliktfall die lokal vorhandenen Versionen von Dateien beibehält:

git checkout --ours *

Die Datei TemplateStore/PageTemplates/page_text/ChannelSource_HTML_html.html mit den Änderungen von Entwickler B wird also als massgeblich betrachtet, die im Repository vorliegenden, von Entwickler A stammenden Änderungen an dieser Datei werden ignoriert.

Import

Entwickler B sollte das Ergebnis des durchgeführten Checkout nun fachlich prüfen, bevor er die Änderungen an der Seitenvorlage in das Repository überführt:

Import der Inhalte aus dem Dateisystem ins FirstSpirit-Projekt
Entwickler B
fs-cli -p DevProject -sd "D:\Git\DevProject" import

Fachliche Prüfung des Projektstandes
Entwickler B

Export

Export der Änderungen ins Dateisystem
Entwickler B exportiert per fs-cli den Projektstand ins lokale Dateisystem
fs-cli -p DevProject -sd "D:\Git\DevProject" export templatestore

Commit / Push

Änderungen ins Git-Repository überführen
Entwickler B überträgt die Änderungen ins Git-Repository
git commit -a -m "export page_text"
git push

Weiteres Vorgehen

Der Konflikt ist aufgelöst. Entwickler B muss zu diesem Zeitpunkt keine weiteren Schritte vornehmen.

Entwickler A

Wenn Entwickler A zu einem späteren Zeitpunkt wieder in die Entwicklung einsteigt, dann geht dieser wie folgt vor:

  1. Aktualisierung des lokalen Git-Repositorys
    Entwickler A
    Die lokale Arbeitsversion auf den Stand des Repositorys bringen:
    git pull
  2. Import der Inhalte aus dem Dateisystem ins FirstSpirit-Projekt
    Entwickler A
    fs-cli -p DevProject -sd "D:\Git\DevProject" import

Sowohl im lokalen Projekt von Entwickler A als auch im Projekt von Entwickler B ist nun die Seitenvorlage page_text in der Version vorhanden, die die Änderungen von Entwickler B enthält:

Zeile 1
Zeile 2 B
Zeile 3
Zeile 4
Zeile 5

© 2005 - 2024 Crownpeak Technology GmbH | Alle Rechte vorbehalten. | FirstSpirit 2024.5 | Datenschutz