0%

Zusammenführen und Konflikte · Übung

Einen Merge-Konflikt lösen

Du hast ein Repository mitten in einem Merge-Konflikt geöffnet. main hat eine Solo-Stufe und Chat-Support hinzugefügt. Gleichzeitig hat simplify-tiers die Preise für Standard und Team erhöht. Beide Änderungen sind nützlich, und pricing.md enthält beide markierten Alternativen. Deine Aufgabe ist, daraus ein bewusst gewähltes Ergebnis zu machen und den Merge abzuschließen.

Diese Lektion funktioniert direkt mit dem unveränderten Ausgangszustand des Kapitels. Du kannst also ohne die früheren Lektionen hier einsteigen. Falls du sie durchgearbeitet hast, enthält dein main außerdem die beiden Merges aus Lektion 4. Am folgenden Vorgehen ändert das nichts.

Den pausierten Merge bestätigen

Beginne mit dem einfachen Befehl, der den aktuellen Zustand des Repositorys beschreibt:

git status

Hier gibt es zwei mögliche Antworten, und beide sind in Ordnung.

Wenn er noch nicht zusammengeführte Pfade meldet und pricing.md nennt, pausiert der Merge bereits. Du kannst direkt zum nächsten Abschnitt gehen. Das siehst du, wenn du unmittelbar in diese Lektion einsteigst.

Wenn er stattdessen einen sauberen Arbeitsbaum meldet, läuft der Merge einfach noch nicht. Diesen Zustand hinterlassen die vorherigen Lektionen dieses Kapitels. Starte ihn jetzt:

git merge simplify-tiers
git status

git merge nimmt den genannten Branch in den Branch auf, auf dem du gerade bist, also main. Git hält bei pricing.md an und meldet die Datei als noch nicht zusammengeführten Pfad, genau wie in Lektion 3 beschrieben.

Entscheiden, was in der fertigen Datei stehen soll

Die geschäftliche Entscheidung ist eindeutig: Behalte die Solo-Stufe und den Chat-Support aus main und verwende die erhöhten Preise für Standard und Team aus simplify-tiers. Die aufgelöste Datei soll so aussehen:

# Pricing

Solo: 12 per month
Standard: 25 per month
Team: 75 per month
Support: email, and chat on Team

Dieses Ergebnis entspricht keinem der beiden Vorgänger. Es verbindet einen bewusst gewählten Teil beider Seiten. Genau dafür brauchte Git einen Menschen.

Öffne die Datei in nano:

nano -w pricing.md

-w verhindert, dass nano in einem schmalen Terminal feste Zeilenumbrüche einfügt. Bearbeite die Datei, bis sie das obige Ergebnis enthält. Entferne alle drei Markierungszeilen und die unerwünschten Alternativzeilen. Speichere mit Ctrl-O, bestätige pricing.md mit Enter und verlasse nano dann mit Ctrl-X.

Die Entscheidung als aufgelöst markieren

Das Speichern verändert die Bytes der Datei. Git behandelt den Pfad aber weiterhin als nicht zusammengeführt, bis du die Auflösung bereitstellst. git add pricing.md legt die aufgelöste Datei in der Staging-Area ab und sagt Git, dass dieser Konflikt entschieden ist.

git add pricing.md
git status

Der zweite Befehl sollte keine ungelösten Pfade mehr auflisten. Stattdessen meldet er, dass alle Konflikte behoben sind, der Merge aber noch läuft. Diesen Zustand solltest du sehen: Das Bereitstellen beendet die Entscheidung über die Datei, nicht den Merge selbst.

Den Merge-Commit abschließen

git commit schließt den pausierten Merge ab, indem es seinen Commit mit zwei Vorgängern erstellt. Die Option -m gibt die Commit-Nachricht in Anführungszeichen direkt an, statt einen Editor zu öffnen.

git commit -m "Merge simplified pricing tiers"
git status

Das abschließende git status sollte einen sauberen Arbeitsbaum und keinen laufenden Merge melden. Der erste Vorgänger des neuen Commits ist der bisherige letzte Commit von main, der zweite ist der letzte Commit von simplify-tiers. Die nicht betroffene index.html blieb genau so, wie sie war.

Wenn du die Übung nach dem abgeschlossenen Merge wiederholen möchtest, tue Folgendes nur im Übungsrepository:

git reset --hard HEAD~1
git merge simplify-tiers

Der harte Reset entfernt den Merge-Commit und stellt die verfolgten Dateien auf den Stand seines ersten Vorgängers zurück. Beide Branches bleiben erhalten. Der zweite Befehl erzeugt deshalb denselben Konflikt erneut. Dabei wird auch spätere, nicht committete Arbeit verworfen. Deshalb gehört das ausschließlich in dieses Übungsrepository, dessen Inhalt du entbehren kannst.

Du hast alle Konfliktmarkierungen entfernt und pricing.md gespeichert. Warum führst du trotzdem noch git add pricing.md aus?

Ein Konflikt ist jetzt ein Ablauf, den du wiederholen kannst: git status lesen, die markierten Alternativen prüfen, ein beabsichtigtes Ergebnis schreiben, jeden aufgelösten Pfad bereitstellen, den Merge committen und prüfen, ob der Arbeitsbaum sauber ist. Wenn du noch nicht entscheiden möchtest, brich ab und kehre zum Zustand vor dem Merge zurück. Kein Schritt verlangt Panik oder das Verwerfen von Arbeit.