External Sync / How to... / Konflikte beheben / Gleichzeitige Änderungen an einer Vorlage / Unterschiedliche Bereiche (Disjunktion)
Gleichzeitige Änderung an einer Vorlage, unterschiedliche Bereiche (Disjunktion)
Inhaltsverzeichnis |
In diesem Szenario wird die Vorgehensweise der Konfliktbehandlung illustriert, wenn die gleichzeitige Arbeit an einer Vorlage durch mehrere Entwickler zu unterschiedlichen Änderungen an den jeweils lokalen Arbeitsversionen der Vorlage führt.
Bei konfliktären Änderungen an unterschiedlichen Stellen derselben Datei wird der Konflikt außerhalb von FirstSpirit, beim Überführen der lokalen Änderungen in das Git-Repository, vom Git-Client per Merge behoben.
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 in der Seitenvorlage 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
Inhalt des Ausgabekanals verändern an anderer Stelle als Entwickler A
Zeile 1
Zeile 2
Zeile 3
Zeile 4 B
Zeile 5 - Export der Änderungen ins Dateisystem
Entwickler B 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 B überträgt die Änderungen ins Git-Repository
git commit -a -m "export page_text"
git push
Er erhält folgende Log-Meldung:
$ 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.
Diese Meldung zeigt an, 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.
Konfliktlösung
Update
Die Behandlung dieses Konfliktfalls kann in diesem Fall automatisch durch den Git-Client erfolgen.
Aktualisierung des lokalen Git-Repositorys
Entwickler B führt eine Aktualisierung der Projektdaten gegen das Git-Repository aus
git pull
Beim Pull-Vorgang führt der Git-Client automatisch einen Merge durch. Meldung des Git-Client auf der Kommandozeile, z. B.:
Auto-merging TemplateStore/PageTemplates/page_text/ChannelSource_HTML_html.html
Merge made by the 'recursive' strategy.
Import
Entwickler B sollte das Ergebnis des durchgeführten Auto-Merge nun fachlich prüfen und danach die Änderungen an der Seitenvorlage in das Repository überführen.
Import der Inhalte aus dem Dateisystem ins FirstSpirit-Projekt
Entwickler B
fs-cli -p DevProject -sd "D:\Git\DevProject" import
Nach dem Import sollte Entwickler B das Ergebnis fachlich prüfen.
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 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 zusammengeführten Version der Ausgabekanaldefinition vorhanden
Zeile 1
Zeile 2 A
Zeile 3
Zeile 4 B
Zeile 5