Merge-Konflikte automatisch lösen (mergiraf)
Git vergleicht beim Mergen Textzeilen – es weiß nicht, dass es eine Java-Klasse, eine YAML-Datei oder ein go.mod vor sich hat. Deshalb entsteht schon dann ein Konflikt, wenn zwei Branches an derselben Stelle verschiedene Dinge ergänzen: zwei neue Methoden am Ende derselben Klasse, zwei neue Einträge in derselben Liste, zwei neue Abhängigkeiten.
mergiraf ist ein Merge-Treiber, der die Datei vorher parst und den Merge auf dem Syntaxbaum ausführt. Solche Konflikte löst er von selbst auf. Du kannst ihn in deinem Managed GitLab bei server.camp als Self-Service aktivieren – er ist auf allen Tarifen verfügbar.
Öffne im Kundenportal die Konfiguration deines GitLab-Abonnements und setze unter Fortgeschritten den Schalter Syntaxbewusstes Mergen (mergiraf).
Beim nächsten Deployment wird mergiraf in deinen GitLab-Container eingebaut und als Merge-Treiber registriert. Deine Instanz startet dabei einmal neu.
Ein aktivierter Treiber merget noch nichtsGit ruft einen Merge-Treiber nur für die Dateien auf, die ein Repository ausdrücklich auf ihn zeigen lässt. Ohne Schritt 2 ändert sich am Verhalten deiner Projekte nichts – das ist Absicht, damit du selbst entscheidest, wo syntaxbewusst gemerget wird.
Lege im Wurzelverzeichnis des Repositories eine Datei .gitattributes an (oder ergänze die bestehende):
* merge=mergiraf
Damit gilt der Treiber für alle Dateien. Für Formate, die mergiraf nicht kennt, fällt er automatisch auf das normale Verhalten von Git zurück – du kannst die Zeile also bedenkenlos so stehen lassen.
Wenn du es lieber ausdrücklich hast, listest du die Dateitypen einzeln auf:
*.java merge=mergiraf
*.go merge=mergiraf
go.mod merge=mergiraf
*.yml merge=mergiraf
*.json merge=mergiraf
Die vollständige Liste der unterstützten Sprachen und Dateiendungen liefert mergiraf languages --gitattributes bzw. die mergiraf-Dokumentation. Committe die .gitattributes und pushe sie – ab dann greift der Treiber in diesem Repository.
Merge Requests werden von GitLab auf dem Server gemerget. Stellt Git dabei einen Konflikt fest, fragt es nun zuerst mergiraf – und nur was mergiraf ebenfalls nicht auflösen kann, landet als echter Konflikt in GitLab.
Ein Beispiel: Zwei Branches ergänzen dieselbe Klasse.
// Branch "feature-a" // Branch "feature-b"
class A { class A {
void a() {} void a() {}
void fromA() {} void fromB() {}
} }
Ohne mergiraf meldet GitLab hier einen Konflikt, weil beide dieselbe Zeile belegen. Mit mergiraf entsteht das naheliegende Ergebnis – beide Methoden bleiben erhalten:
class A {
void a() {}
void fromA() {}
void fromB() {}
}
- Der Treiber greift nur bei einem echten Konflikt. Merges, die Git ohnehin sauber hinbekommt, laufen unverändert.
- Er ist kein Ersatz für ein Review: mergiraf entscheidet strukturell, nicht inhaltlich. Zwei Änderungen können syntaktisch zusammenpassen und fachlich trotzdem falsch sein.
- Was mergiraf nicht auflösen kann, bleibt ein normaler Konflikt mit den gewohnten Konfliktmarkern.
Auf dem Server hilft mergiraf beim Mergen von Merge Requests. Wenn du dieselbe Automatik beim lokalen git merge oder git rebase haben willst, installiere mergiraf zusätzlich auf deinem Rechner – die .gitattributes aus Schritt 2 gilt dort genauso. Die Einrichtung beschreibt die mergiraf-Dokumentation.
Schalte einfach den Schalter im Portal aus: Mit dem nächsten Deployment verschwinden Treiber und Binary wieder aus deiner Instanz. Die .gitattributes in deinen Repositories kannst du stehen lassen – Git ignoriert einen Verweis auf einen Treiber, den es nicht kennt, und merget wieder zeilenweise.