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
- 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 - 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 - Ä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
- 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 - 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 - Ä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:
- Aktualisierung des lokalen Git-Repositorys
Entwickler A
Die lokale Arbeitsversion auf den Stand des Repositorys bringen:
git pull - 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