Lektion 23 · Erholung
Lösen Sie Merge- und Rebase-Konflikte
Lösen Sie dieselbe konkurrierende Überschrift in einer Zusammenführung und in einer Rebase auf, sehen Sie, warum „unsere“ und „ihre“ zwischen ihnen wechseln, speichern Sie ein bewusst kombiniertes Ergebnis und schließen Sie jede Operation ab, ohne die Idee einer der beiden Personen zu verlieren.
- Ebene: Mittelstufe
- 13 Min. gelesen
- 7 Min. Video
- Aktualisiert
- Vor dieser Lektion: Führen Sie Zweige mit unterschiedlicher Historie zusammen, Rebasieren Sie unveröffentlichte Arbeiten auf einer neuen Basis
In diesem Browser gespeicherter Fortschritt.
Beim Abspielen wird das Video von YouTube geladen (erweiterter Datenschutzmodus).
Englische Erzählung · English and Arabic Bildunterschriften
Öffnen Sie die VideoseiteAuf YouTube ansehenWas Sie lernen werden
- Lesen Sie einen echten Konflikt: die Basis, die aktuelle Seite und die eingehende Seite.
- Erklären Sie, warum „unsere“ und „ihre“ zwischen einer Zusammenführung und einer Neubasis wechseln.
- Schreiben Sie einen bewussten Vorsatz auf und markieren Sie ihn dann als gelöst.
- Setzen Sie den Vorgang fort und prüfen Sie, dass nichts halb erledigt ist.
Bevor Sie beginnen
Zwei Teamkollegen haben dieselbe Zeile auf der Seite geändert. Am conflict/sara hat Sara die Heldenüberschrift in „Änderungen mit Zuversicht prüfen“ geändert. Am conflict/omar änderte Omar dieselbe Zeile in „Verstehen Sie jede gespeicherte Änderung.“ Beide Zweige beginnen mit dem Commit M, dessen Überschrift „Sehen Sie Ihre Arbeit klar“ lautete, und jeder Zweig hat genau einen Commit. Sie erstellen zwei identische Kopien dieser Divergenz: eine für die Zusammenführung (gittree-conflict-merge) und eine für die Rebase (gittree-conflict-rebase). In beiden Fällen ist conflict/sara ausgecheckt und der Arbeitsbaum ist sauber. Es wird kein Merge oder Rebase ausgeführt.
Alles ist lokal und im kostenlosen Plan (GitTree fordert Sie auf, sich anzumelden): kein Hosting-Konto, kein Anbieter, kein Internet. Jede Identität ist fiktiv (example.com). Führen Sie diese Lektion niemals in einem echten Projekt aus.
Nehmen Sie die Änderungen in GitTree oder mit den nativen Git-Befehlen vor, nicht beides in derselben Kopie. Das Ablesen des Ergebnisses ist immer sicher. Die Menübezeichnungen stammen aus den eigenen Strings von GitTree 2.0 und die nativen Befehle wurden mit Git 2.43 in Einwegkopien ausgeführt. Die GitTree-Schritte wurden nicht auf macOS, Windows oder Linux ausgeführt.
Konzept und Zustandswirkungen
Ein Inhaltskonflikt bedeutet, dass Git nicht allein ein Ergebnis auswählen kann: Beide Seiten haben dieselben Zeilen unterschiedlich geändert. Git stoppt und behält drei Versionen der Datei im Index: Stufe 1 ist die gemeinsame Basis, Stufe 2 ist „unsere“ und Stufe 3 ist „ihre“. Außerdem werden Konfliktmarkierungen in die Datei in Ihrem Arbeitsbaum geschrieben. Durch das Entfernen der Markierungen in einem Editor wird für Git nichts aufgelöst: Die Datei wird nur aufgelöst, wenn Sie das Ergebnis speichern und bereitstellen, wodurch Stufe 0 wiederhergestellt wird.
„Unsere“ und „ihre“ sind Positionen, keine Menschen. Bei einer Zusammenführung befinden Sie sich auf Saras Zweig, also ist unsere Version Saras (die aktuelle Seite) und ihre Version ist Omars (die eingehende Seite). Bei einem Rebase von Sara auf Omar wechselt Git zunächst zu Omars Zweig und spielt dann Saras Commit ab, sodass unsere Version Omars Version ist (der Zweig, auf den Sie umbasieren) und ihre Version Saras Commit ist. GitTree druckt die Rolle neben jedem Namen, sodass Sie sich nicht merken müssen: „(current)“ und „(incoming)“ bei einer Zusammenführung, „(rebasing on)“ und „(your commit)“ bei einer Rebase.
Das richtige Ergebnis ist selten eine Seite. Hier lautet die beabsichtigte Lösung: „Überprüfen Sie jede Änderung mit Zuversicht.“ Dies ist weder Saras noch Omars Aussage. Lassen Sie jede zweite Zeile der Seite genau so, wie sie war. Wenn Sie die Datei als „gelöst“ markieren, wird Ihr Ergebnis angezeigt. „Fortfahren“ ist ein separater Schritt, der den Zusammenführungs-Commit abschließt oder Saras Commit für Omars neu erstellt.
Während der Vorgang gestoppt ist, befindet sich die Verzweigung dort, wo der Vorgang sie verlassen hat, und es liegt ein Konflikt mit der Datei vor. Nichts erreicht einen Server.
Bereiten Sie den genauen Projektstand vor
Machen Sie eine Divergenz und kopieren Sie sie dann zweimal. Beginnen Sie mit einer separaten normalen Kopie des Projekts, so wie es in Lektion 18 hinterlassen wurde, und lassen Sie Ihr Original gittree-features unberührt. Die Seitenversionen sind unten aufgeführt: MERGED ist die gemeinsame Basis, SARA und OMAR sind die beiden konkurrierenden Versionen und RESOLVED ist das Ergebnis, das Sie speichern werden.
Vollständige Dateieingaben
Speichern Sie nur in der unten genannten Phase. Dabei handelt es sich um vollständige UTF-8/LF-Körper mit einem abschließenden Zeilenumbruch; Fügen Sie niemals Markdown-Zäune ein. Unveränderte ausführbare Dateien erben die benannte Eingabe. Versionen in separaten Varianten dürfen das Original nicht überschreiben.
index.html – ZUSAMMENGEFÜHRT
<!doctype html>
<html lang="en">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<title>GitTree Features — course demo</title>
<link rel="stylesheet" href="styles.css">
</head>
<body>
<header class="site-header">
<a href="#main">GitTree Features</a>
</header>
<main id="main" tabindex="-1">
<section class="hero" aria-labelledby="hero-title">
<p class="eyebrow">GitTree Learn demo project</p>
<h1 id="hero-title">See your work clearly.</h1>
<p id="hero-copy">Choose one change, then check what Git saved.</p>
</section>
<section class="features" aria-labelledby="features-title">
<h2 id="features-title">Follow your work</h2>
<div class="cards">
<article class="feature-card">
<h3>History</h3>
<p>Read commits and branches together.</p>
</article>
<article class="feature-card">
<h3>Changes</h3>
<p>Review the exact content selected for a commit.</p>
</article>
<article class="feature-card">
<h3>Recovery</h3>
<p>Inspect the scope of a recovery point before using it.</p>
</article>
</div>
</section>
<section aria-labelledby="plans-title">
<h2 id="plans-title">Choose the workflow you need</h2>
<div class="cards">
<article class="feature-card">
<h3>Local Git</h3>
<p>Local Git workflows work without signing in.</p>
</article>
<article class="feature-card">
<h3>Connected workflows</h3>
<p>Provider integrations and Nour require Pro or an applicable trial.</p>
</article>
</div>
</section>
</main>
<footer><p>Built by a fictional team for GitTree Learn. Review one change at a time.</p></footer>
<script type="module" src="site.js"></script>
</body>
</html>index.html – SARA
<!doctype html>
<html lang="en">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<title>GitTree Features — course demo</title>
<link rel="stylesheet" href="styles.css">
</head>
<body>
<header class="site-header">
<a href="#main">GitTree Features</a>
</header>
<main id="main" tabindex="-1">
<section class="hero" aria-labelledby="hero-title">
<p class="eyebrow">GitTree Learn demo project</p>
<h1 id="hero-title">Review changes with confidence.</h1>
<p id="hero-copy">Choose one change, then check what Git saved.</p>
</section>
<section class="features" aria-labelledby="features-title">
<h2 id="features-title">Follow your work</h2>
<div class="cards">
<article class="feature-card">
<h3>History</h3>
<p>Read commits and branches together.</p>
</article>
<article class="feature-card">
<h3>Changes</h3>
<p>Review the exact content selected for a commit.</p>
</article>
<article class="feature-card">
<h3>Recovery</h3>
<p>Inspect the scope of a recovery point before using it.</p>
</article>
</div>
</section>
<section aria-labelledby="plans-title">
<h2 id="plans-title">Choose the workflow you need</h2>
<div class="cards">
<article class="feature-card">
<h3>Local Git</h3>
<p>Local Git workflows work without signing in.</p>
</article>
<article class="feature-card">
<h3>Connected workflows</h3>
<p>Provider integrations and Nour require Pro or an applicable trial.</p>
</article>
</div>
</section>
</main>
<footer><p>Built by a fictional team for GitTree Learn. Review one change at a time.</p></footer>
<script type="module" src="site.js"></script>
</body>
</html>index.html – OMAR
<!doctype html>
<html lang="en">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<title>GitTree Features — course demo</title>
<link rel="stylesheet" href="styles.css">
</head>
<body>
<header class="site-header">
<a href="#main">GitTree Features</a>
</header>
<main id="main" tabindex="-1">
<section class="hero" aria-labelledby="hero-title">
<p class="eyebrow">GitTree Learn demo project</p>
<h1 id="hero-title">Understand each saved change.</h1>
<p id="hero-copy">Choose one change, then check what Git saved.</p>
</section>
<section class="features" aria-labelledby="features-title">
<h2 id="features-title">Follow your work</h2>
<div class="cards">
<article class="feature-card">
<h3>History</h3>
<p>Read commits and branches together.</p>
</article>
<article class="feature-card">
<h3>Changes</h3>
<p>Review the exact content selected for a commit.</p>
</article>
<article class="feature-card">
<h3>Recovery</h3>
<p>Inspect the scope of a recovery point before using it.</p>
</article>
</div>
</section>
<section aria-labelledby="plans-title">
<h2 id="plans-title">Choose the workflow you need</h2>
<div class="cards">
<article class="feature-card">
<h3>Local Git</h3>
<p>Local Git workflows work without signing in.</p>
</article>
<article class="feature-card">
<h3>Connected workflows</h3>
<p>Provider integrations and Nour require Pro or an applicable trial.</p>
</article>
</div>
</section>
</main>
<footer><p>Built by a fictional team for GitTree Learn. Review one change at a time.</p></footer>
<script type="module" src="site.js"></script>
</body>
</html>index.html – BEHOBEN
<!doctype html>
<html lang="en">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<title>GitTree Features — course demo</title>
<link rel="stylesheet" href="styles.css">
</head>
<body>
<header class="site-header">
<a href="#main">GitTree Features</a>
</header>
<main id="main" tabindex="-1">
<section class="hero" aria-labelledby="hero-title">
<p class="eyebrow">GitTree Learn demo project</p>
<h1 id="hero-title">Review each change with confidence.</h1>
<p id="hero-copy">Choose one change, then check what Git saved.</p>
</section>
<section class="features" aria-labelledby="features-title">
<h2 id="features-title">Follow your work</h2>
<div class="cards">
<article class="feature-card">
<h3>History</h3>
<p>Read commits and branches together.</p>
</article>
<article class="feature-card">
<h3>Changes</h3>
<p>Review the exact content selected for a commit.</p>
</article>
<article class="feature-card">
<h3>Recovery</h3>
<p>Inspect the scope of a recovery point before using it.</p>
</article>
</div>
</section>
<section aria-labelledby="plans-title">
<h2 id="plans-title">Choose the workflow you need</h2>
<div class="cards">
<article class="feature-card">
<h3>Local Git</h3>
<p>Local Git workflows work without signing in.</p>
</article>
<article class="feature-card">
<h3>Connected workflows</h3>
<p>Provider integrations and Nour require Pro or an applicable trial.</p>
</article>
</div>
</section>
</main>
<footer><p>Built by a fictional team for GitTree Learn. Review one change at a time.</p></footer>
<script type="module" src="site.js"></script>
</body>
</html>In GitTree
Öffnen Sie die Palette mit Befehl+Umschalt+P (Strg+Umschalt+P bei Ubuntu). Aktionen für einen benannten Zweig verwenden das Rechtsklickmenü dieses Zweigs.
- Erstellen Sie die beiden Kopien, wie im nächsten Abschnitt gezeigt. Öffnen Sie gittree-conflict-merge, wobei
conflict/saraausgecheckt ist. - Klicken Sie mit der rechten Maustaste auf
conflict/omarund wählen Sie Merge conflict/omar into conflict/sara. Wählen Sie unter Record it as Always a merge commit aus. Der Dialog warnt: „Wird bei einem Konflikt in einer Datei angehalten“; wähle Merge. Die Zusammenführung stoppt, was das erwartete Ergebnis ist. - Auf dem Banner steht „Konflikt/omar in Konflikt/sara zusammenführen“ mit „1 Konflikt“ und Continue ist noch nicht verfügbar: „Lösen Sie zuerst die 1 Konflikte.“ Wählen Sie Resolve.
- Öffnen Sie
index.htmlvon Conflicted files. Lesen Sie die beiden Seiten conflict/sara (current) und conflict/omar (incoming) und verwenden Sie Show Base, um Base (common ancestor) zu lesen. - Wählen Sie Edit Output, ersetzen Sie die widersprüchliche Überschrift durch
Review each change with confidence.und behalten Sie jede zweite Zeile bei. Wählen Sie dann Save and Mark Resolved. Das Löschen der Markierungen und das Schließen der Datei reicht nicht aus. - Zurück auf dem Banner wählen Sie Continue. Wenn eine Nachricht angeboten wird, behalten Sie die vorgeschlagene Nachricht bei. Warten Sie, bis die Zusammenführung abgeschlossen ist: Der neue Commit hat zwei übergeordnete Elemente.
- Öffnen Sie gittree-conflict-rebase, wobei
conflict/saraausgecheckt ist. Klicken Sie mit der rechten Maustaste aufconflict/omarund wählen Sie Rebase conflict/sara onto conflict/omar. Lassen Sie die Optionen unter Options for this rebase deaktiviert und wählen Sie dann Rebase conflict/sara. Es hört bei einem Konflikt auf. - Wählen Sie Resolve und öffnen Sie
index.html. Die Seiten sind jetzt conflict/omar (rebasing onto) und conflict/sara (your commit): die Rollen sind vertauscht. Machen Sie dasselbe Edit Output → Save and Mark Resolved, dann Continue. - Überprüfen Sie beide Kopien: Die Datei hat den Status BEHOBEN, es ist keine Konfliktdatei mehr übrig und es wird kein Banner angezeigt. Halten Sie die beiden Ergebnisse auseinander und drängeln Sie nicht.
Für jeden gewöhnlichen Commit im Kurs: Summary ist das angegebene Subjekt, Description ist leer und die Optionen Amend Previous Commit, Skip Hooks, Add Signed-off-by, Different Author, Push After Commit und Allow Empty Commit bleiben ausgeschaltet.
Im Terminal
In einer separaten sauberen Kopie des Ergebnisses von Lektion 18:
git switch --create conflict/sara
BASE_SHA="$(git rev-parse HEAD)"Speichern Sie SARA als index.html, dann:
git add -- index.html
git -c user.name="Sara Lindqvist" -c user.email=sara@example.com commit --quiet -m "feat: Sara clarifies the hero"
git switch --quiet --create conflict/omar "$BASE_SHA"Speichern Sie OMAR als index.html, dann:
git add -- index.html
git -c user.name="Omar Haddad" -c user.email=omar@example.com commit --quiet -m "feat: Omar explains the hero"
git switch --quiet conflict/saraBASE_SHA ist M, vor einem konkurrierenden Commit. Erstellen Sie zwei saubere Kopien dieser Divergenz, eine für die Zusammenführung und eine für die Rebase (cd .. && cp -R gittree-features gittree-conflict-merge && cp -R gittree-features gittree-conflict-rebase). In der Zusammenführungskopie:
git merge --no-ff --no-edit conflict/omar
git ls-files --unmerged
git show :2:index.html
git show :3:index.htmlDie Zusammenführung stoppt mit Exit-Code 1 und git ls-files --unmerged listet drei Einträge auf, Stufen 1, 2 und 3. git show :2:index.html ist Saras Version (unsere) und :3: ist Omars (ihre); :1: ist die Basis. Speichern Sie GELÖST als index.html, dann:
git add -- index.html
git -c core.editor=true merge --continue
git ls-files --unmerged
git status --shortDie letzten beiden Befehle geben nichts aus. In der unberührten Rebase-Kopie:
git rebase conflict/omar
git show :2:index.html
git show :3:index.htmlDie Rebase stoppt. Jetzt ist :2: Omars Version und :3: Saras Version: die Rollen wurden vertauscht. Speichern Sie GELÖST als index.html, dann:
git add -- index.html
git -c core.editor=true rebase --continue
git ls-files --unmerged
git status --shortBeide Dateien sind jetzt GELÖST und nichts ist nicht mehr zusammengeführt. core.editor=true akzeptiert nur die vorhandene Commit-Nachricht für diesen einen Befehl; Es ändert nichts an Ihrer Editor-Einstellung. Um einen gestoppten Vorgang ohne Lösung zu verlassen, verwenden Sie git merge --abort oder git rebase --abort.
Ergebnis
Where you end: die Zusammenführungskopie hat einen neuen Commit mit zwei übergeordneten Elementen und der kombinierten Überschrift; In der Rebase-Kopie wurde Saras Commit auf Omars Commit mit der gleichen kombinierten Überschrift neu erstellt. In beiden Fällen ist index.html gleich BEHOBEN, es ist kein Konflikteintrag mehr übrig, der Vorgang ist beendet und der Status ist sauber.
Häufige Fehler
- Angenommen, mit „unserem“ ist immer Ihr eigenes Feature gemeint. Es bedeutet, auf welcher Seite Git steht, und das ändert sich mit der Operation.
- Nehmen Sie eine Seite im großen Stil („Take All“), bevor Sie beide Versionen und den Rest der Datei lesen.
- Die Konfliktmarkierungen werden gelöscht, die Datei wird jedoch nie gespeichert und als gelöst markiert.
- Wiederholen einer bereits abgeschlossenen Zusammenführung oder Rebase.
Wenn etwas schief geht
Wenn ein Stopp falsch aussieht, stellt Abort… aus dem Banner den Status wieder her, von dem aus der Vorgang gestartet wurde, und verwirft die bisher vorgenommenen Auflösungen. GitTree speichert zunächst einen Wiederherstellungs-Snapshot. Wenn sich die Datei während der Bearbeitung geändert hat, verwenden Sie die Optionen Compare und Use as Output, anstatt eine alte Speicherung zu erzwingen. Bewahren Sie eine Kopie Ihres Entwurfs auf, bevor Sie ihn ersetzen.
Überprüfen Sie Ihr Verständnis
Beantworten Sie jede Frage und lesen Sie dann, warum. Mit „erforderlich“ gekennzeichnete Fragen zählen zum Abschluss der Lektion.
0 von 6 korrekt
Beantworten Sie die erforderlichen Fragen richtig, um die Lektion abzuschließen.
In diesem Browser überprüft.
Üben
Beweisen Sie die Bühnenrollen für beide Vorgänge mit git show :2:index.html und git show :3:index.html, speichern Sie dann dieselbe RESOLVED-Datei und schließen Sie jeden Vorgang ab. Sagen Sie voraus, was auf der Seite übrig bleiben würde, wenn Sie in beiden Kopien blind „unsere“ übernehmen würden.
Ihre eigene Bestätigung: Die Website kann Ihren Computer nicht sehen.
Um die Lektion abzuschließen, beantworten Sie die erforderlichen Fragen richtig und bestätigen Sie die praktische Übung.
Zusammenfassung
- Unsere und ihre Rollen hängen von der Operation ab.
- Zuerst speichern und als gelöst markieren, dann fortfahren.
- Überprüfen Sie anschließend die gesamte Datei und den Betriebsstatus.
Verwandt
Glossarbegriffe eingeführt
Konflikt – تعارض; Basis – الأساس; unseres – نسختنا; ihres – نسختهم; beschließen – حلّ.
Videotranskript
Die Erzählung des Videos, Stichwort für Stichwort.
Zeigen Sie das Transkript
- Ein Konflikt ist kein Fehler. Es ist ein Frage, die nur du beantworten kannst.
- Zwei Personen haben die gleiche Zeile geändert gleiche Datei.
- Sara hat eine Überschrift geschrieben. Omar schrieb ein anderer. Beide begannen auf derselben Seite.
- Git kann nicht erraten, welche Linie gewinnt, also bleibt stehen und fragt dich.
- Bauen Sie zunächst die Zweige von Sara und Omar. und zwei identische Kopien.
- In der ersten Kopie verschmelzen wir. Im zweiten, wir rebasieren.
- Öffnen Sie die Zusammenführungskopie in Saras Zweig.
- Klicken Sie mit der rechten Maustaste auf Omars Zweig und wählen Sie ihn aus Befehl zusammenführen.
- Der Dialog warnt bereits: Dies wird beendet mit einem Konflikt in einer Datei.
- Wählen Sie „Immer ein Zusammenführungs-Commit“ und dann „Zusammenführen“. einmal. Es stoppt wie erwartet.
- Das Banner zeigt einen Konflikt. Weiter ist noch nicht verfügbar.
- Wählen Sie „Auflösen“ und öffnen Sie index.html.
- Zwei Seiten: Saras Zweig ist aktuell, Omars kommt.
- Show Base enthüllt den gemeinsamen Vorfahren, den Seite, bevor Sie eine Änderung vornehmen.
- Bearbeiten Sie nun die Ausgabe. Ersetzen Sie die Überschrift durch eine bewusste Zeile.
- Speichern und als gelöst markieren. Erst jetzt funktioniert Git Behandeln Sie die Datei als gelöst.
- Zurück auf dem Banner wählen Sie Weiter. Die Die Zusammenführung ist abgeschlossen.
- Das neue Commit hat zwei Eltern und das kombinierte Überschrift.
- Jetzt die Rebase-Kopie, auch bei Sara Zweig.
- Klicken Sie mit der rechten Maustaste auf Omars Zweig und rebase Saras Zweig darauf.
- Lassen Sie die Optionen deaktiviert und starten Sie einmal neu. Es stoppt mit einem Konflikt.
- Schauen Sie sich die Etiketten an. Jetzt ist Omars Zweig derjenige, auf den wir zurückgreifen.
- Saras Commit wird wiederholt. Die Rollen haben getauscht.
- Gleiche Auflösung: Ausgabe bearbeiten, dann speichern und „Als gelöst markieren“ und dann „Weiter“.
- Saras Commit wird zusätzlich neu erstellt Omars, mit der gleichen Überschrift.
- Listen Sie im Terminal die nicht zusammengeführten Einträge auf einer gestoppten Zusammenführung.
- Phase zwei gehört uns: Saras Kurs. Bühne Drei gehört ihnen: Omars.
- In einer gestoppten Rebase, Stufe zwei und drei sind umgekehrt.
- Nach dem Fix wird nichts mehr zusammengeführt, und Der Status ist leer.
- Der Tipp der Zusammenführungskopie hat zwei Eltern; die Der Tipp von Rebase Copy hat einen.
- Ändern Sie die Eingabe: Löschen Sie die Markierungen und Speichern, aber nicht als gelöst markieren.
- Git sieht immer noch drei Stufen, also fahren Sie fort bleibt nicht verfügbar.
- Gesteckt? Abort setzt den Zweig dorthin zurück, wo er liegt Die Operation begann.
- GitTree speichert zuerst einen Wiederherstellungs-Snapshot, So ist auch eine Abtreibung sicher.
- Nehmen Sie niemals alles von einer Seite vor sich Lesen Sie beide Versionen.
- Übung: Beweisen Sie die Bühnenrollen in beiden Kopien, dann beenden Sie beide.
- Als nächstes können Sie einen Vorgang fortsetzen, überspringen oder abbrechen das hat aufgehört.