Git Konflikte lösen

6 Kernkonzepte
Die wichtigsten Methoden zum Lösen von Git-Konflikten: Conflict Markers · git merge · git rebase · git mergetool · --ours/--theirs · Strategien & Tipps Konflikte entstehen, wenn Git nicht automatisch entscheiden kann, welche Änderungen übernommen werden sollen. Diese Cheatsheet zeigt Ihnen, wie Sie Konflikte effizient erkennen und lösen.

Conflict Markers – Konflikte erkennen

<<<<<< · ======= · >>>>>>
<<<<<< HEAD console.log("Hallo von main"); ======= console.log("Hallo von feature"); >>>>>> feature-branch

Conflict Markers werden von Git in die Datei eingefügt, wenn ein Konflikt auftritt. Der Bereich zwischen <<<<<< und >>>>>> muss manuell aufgelöst werden.

Beispiele
# Konflikt in index.html
<h1>Willkommen auf unserer Seite</h1>
<<<<<< HEAD
<p>Das ist die aktuelle Version.</p>
=======
<p>Das ist die neue Version aus dem Feature-Branch.</p>
>>>>>> feature/new-content
# Nach der Auflösung (beide Versionen kombiniert):
<h1>Willkommen auf unserer Seite</h1>
<p>Das ist die aktuelle Version mit neuen Inhalten aus dem Feature.</p>
Tipp: Suchen Sie nach diesen Markern, um Konflikte zu finden: git grep --orphan '^[<=>]\{7\}'. Löschen Sie alle Marker und die nicht benötigten Versionen – nur der finale Code sollte übrig bleiben.

Merge Konflikte – Konflikte beim Zusammenführen

git merge · git status · git add · git commit
Auto-merging app.js CONFLICT (content): Merge conflict in app.js Automatic merge failed; fix conflicts and then commit the result. git status both modified: app.js

Merge Konflikte treten auf, wenn Sie zwei Branches zusammenführen, die an der gleichen Stelle geändert wurden. Git zeigt die Konflikte an und Sie müssen sie manuell auflösen.

Beispiele
# Merge mit Konflikt
git checkout main
git merge feature-branch
CONFLICT (content): Merge conflict in app.js
# Konflikt auflösen – Datei bearbeiten, Marker entfernen
vim app.js
# Konflikt als gelöst markieren
git add app.js
# Merge abschließen
git commit -m "Merge branch feature-branch"
# Merge abbrechen (bei Problemen)
git merge --abort
Tipp: Vor einem Merge: git pull --rebase oder git fetch und git status prüfen. So minimieren Sie Überraschungen. Bei großen Konflikten git merge --abort und später erneut versuchen.

Rebase Konflikte – Konflikte beim Umschreiben

git rebase · git rebase --continue · git rebase --abort
CONFLICT (content): Merge conflict in README.md Could not apply 12a34bc... Update README git status both modified: README.md You are currently rebasing branch 'feature' on 'main'.

Rebase Konflikte treten beim git rebase auf, wenn Commits auf eine neue Basis angewendet werden und dabei Konflikte entstehen. Die Auflösung erfolgt ähnlich wie beim Merge.

Beispiele
# Rebase mit Konflikt
git checkout feature
git rebase main
CONFLICT (content): Merge conflict in README.md
# Datei bearbeiten, Konflikt auflösen
vim README.md
# Als gelöst markieren
git add README.md
# Rebase fortsetzen
git rebase --continue
# Oder überspringen eines Commits
git rebase --skip
# Rebase abbrechen
git rebase --abort
Tipp: Bei Rebase-Konflikten können Sie git rebase --skip verwenden, um einen Commit zu überspringen (wenn er nicht mehr benötigt wird). --abort bringt Sie zurück zum Zustand vor dem Rebase.

git mergetool – Konflikte mit Tools lösen

git mergetool · meld · vimdiff · kdiff3
git mergetool git config --global merge.tool meld git config --global mergetool.meld.path /usr/bin/meld

git mergetool startet ein grafisches oder textbasiertes Tool zum Lösen von Konflikten. Beliebte Tools sind Meld, Vimdiff, KDiff3 und Beyond Compare.

Häufige Merge-Tools

Tool Beschreibung Installation
meld Grafisches Diff-Tool (Linux, Windows, macOS) sudo apt install meld
vimdiff Vim mit Diff-Modus (standardmäßig verfügbar) vim (vorinstalliert)
kdiff3 Leistungsstarkes grafisches Merge-Tool sudo apt install kdiff3
p4merge Perforce Merge Tool (kostenlos) Download von Perforce
bc3 Beyond Compare 3 (kommerziell) Download von Scooter Software
Beispiele
# Merge-Tool setzen
git config --global merge.tool meld
# Konflikt mit Tool öffnen
git mergetool
# Nach dem Speichern: Konflikt ist gelöst
Merging app.js
Normal merge conflict for 'app.js':
{local}: modified file
{remote}: modified file
Hit return to start merge resolution tool (meld):
# Vimdiff starten
git config --global merge.tool vimdiff
git mergetool
Tipp: In vimdiff verwenden Sie do (diff obtain) um Änderungen vom anderen Fenster zu übernehmen und dp (diff put) um Änderungen zu übertragen. :wq speichert und beendet.

--ours / --theirs – Automatische Konfliktlösung

git checkout --ours · git checkout --theirs · git merge -Xours
git checkout --ours datei.txt git checkout --theirs datei.txt git merge -Xours feature-branch

--ours und --theirs sind Optionen, um Konflikte automatisch zu lösen – indem Sie Ihre Version oder die des anderen Branches übernehmen. Achtung: Dies kann zu Datenverlust führen!

Beispiele
# Nach Konflikt: Eigene Version behalten
git checkout --ours app.js
git add app.js
# Version des anderen Branches übernehmen
git checkout --theirs app.js
git add app.js
# Merge mit automatischer Entscheidung für --ours
git merge -Xours feature-branch
# Bei allen Dateien im Konflikt: --ours verwenden
git merge -Xours --no-ff feature
# Nur für bestimmte Dateien im Konflikt
git checkout --ours -- src/*.js
⚠️ Warnung: --ours und --theirs sind gefährlich – sie überschreiben alle Konflikte ohne Rücksicht auf die tatsächlichen Änderungen. Verwenden Sie sie nur, wenn Sie genau wissen, welche Version richtig ist!

Strategien & Tipps – Konflikte vermeiden & lösen

Best Practices · Prävention · Workflow
# Vor einem Merge git fetch git status git pull --rebase # Konfliktanalyse git diff git log --graph

Strategien & Tipps helfen, Konflikte zu vermeiden und effizient zu lösen. Eine gute Vorbereitung und Kommunikation im Team sind der Schlüssel.

Best Practices

Praxis Beschreibung
Häufig pullen Tägliches git pull --rebase minimiert Konflikte
Kleine Commits Kleinere, fokussierte Commits sind einfacher zu mergen
Feature Branches Jedes Feature in einem eigenen Branch entwickeln
Merge vs Rebase Rebase für eine saubere Historie, Merge für die Nachvollziehbarkeit
Git diff nutzen Konflikte vor dem Merge mit git diff analysieren
Code Reviews Reviews helfen, Konflikte frühzeitig zu erkennen
Beispiele
# Vor einem Merge: Aktuellen Stand holen
git fetch --all
git status
# Potenzielle Konflikte anzeigen
git diff main..feature
# Konflikte visualisieren
git log --graph --oneline --decorate
# Nach großem Merge: Testen nicht vergessen!
npm test # oder ./tests.sh
# Git-Editor für Commit-Messages konfigurieren
git config --global core.editor "code --wait"
Tipp: Führen Sie nach jedem Merge die Tests aus, um sicherzustellen, dass die Auflösung korrekt war. Ein guter Git-Workflow mit regelmäßigen Code-Reviews reduziert Konflikte erheblich.

Git Konfliktlösung im Überblick

Marker Konflikt erkennen
<<<<<<< ======= >>>>>>>
Merge Zusammenführen von Branches
git merge, --abort
Rebase Commits umschreiben
git rebase, --continue
Mergetool Grafische Konfliktlösung
meld, vimdiff, kdiff3
--ours Eigene Version übernehmen
Vorsicht! Datenverlust möglich
Strategie Vermeidung & Prävention
Häufig pullen, kleine Commits

Quick Summary

Marker
Konflikt erkennen
merge
Merge-Konflikte
rebase
Rebase-Konflikte
mergetool
Tools nutzen
--ours
Automatische Lösung
Strategien
Vermeiden & Lösen
git merge --abort · git rebase --continue · git mergetool · git checkout --ours