Lektion 25 · Geschichte und Integration
Ausgewählte Commits mit Cherry-Pick anwenden
Kopieren Sie den Fix eines Teamkollegen in Ihren Release-Zweig, ohne seinen gesamten Zweig zusammenzuführen, und überprüfen Sie dann den neuen Commit, seinen Autor, seine Dateien und was zurückgeblieben ist.
- Ebene: Mittelstufe
- 11 Min. gelesen
- 5 Min. Video
- Aktualisiert
- Vor dieser Lektion: Lesen Sie den Verlauf, ohne den KOPF zu bewegen, Lösen Sie Merge- und Rebase-Konflikte
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
- Wählen Sie den einen Commit aus, den Sie kopieren möchten, und sehen Sie, warum sein übergeordneter Commit nicht mitkommt.
- Sagen Sie die ID, den Autor und den Committer des neuen Commits voraus.
- Erkennen Sie eine fehlende Abhängigkeit oder eine bereits angewendete Änderung, bevor Sie etwas erzwingen.
- Vergleichen Sie das Ergebnis mit dem Quellzweig.
Bevor Sie beginnen
Priyas Zweig priya/label enthält zwei Commits über einer gemeinsamen Baseline B (der Anmeldeseite). Die erste ist eine nicht verwandte Notiz, „docs: unverwandte Quellnotiz“, die docs/temporary-review.md hinzufügt. Die zweite Lösung ist ihr Fix „Fix: Klarstellung des fiktiven E-Mail-Labels“, der das Label in index.html ändert. Ihr Zweig release/label beginnt mit derselben Baseline B und verfügt über einen eigenen Commit, „docs: record target review“, der docs/integration-note.md hinzufügt. release/label ist ausgecheckt und der Arbeitsbaum ist sauber. Sie möchten, dass sie Ihren Zweig repariert, aber nicht ihre Notiz.
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
Cherry-Pick nimmt die Änderung, die ein Commit vorgenommen hat, gemessen an seinem eigenen übergeordneten Commit, und wendet sie als new-Commit auf den Zweig an, in dem Sie sich befinden. Es bringt weder das übergeordnete Element noch die Commits dazu. Genau aus diesem Grund können Sie Priyas Lösung in Anspruch nehmen und ihre Notiz zurücklassen.
Der Quell-Commit wird nicht berührt. Der neue Commit hat eine neue ID, da er ein neues übergeordnetes Element hat, behält aber den ursprünglichen Autor und die ursprüngliche Nachricht bei. Der Committer, die Person, die diesen Commit durchgeführt hat, sind Sie. Dieselbe Änderung mit derselben Nachricht ist immer noch ein unterschiedlicher Commit.
Abhängigkeiten sind immer noch wichtig. Der Fix bearbeitet eine Zeile des Anmeldeformulars, sodass der Zielzweig bereits über dieses Formular verfügen muss. Ist dies nicht der Fall, bricht Git mit einem Konflikt ab. Wenn das Ziel bereits dieselbe Änderung enthält, wäre die Auswahl leer und Git stoppt erneut. Schauen Sie sich in beiden Fällen an, was in der Operation steht. Erzwingen Sie keinen leeren Commit, nur um daran vorbeizukommen.
Nur der Zielzweig wird verschoben. priya/label und alles auf einem Server bleibt wie es war. Der neue Commit fügt die Labeländerung zu release/label hinzu und nichts anderes.
Bereiten Sie den genauen Projektstand vor
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. Speichern Sie SIGNUP als Basis und erstellen Sie dann die beiden Zweige. Die folgenden Körper sind die Basisseite (SIGNUP), die unabhängige Notiz (DOC_NOISE), die feste Seite (SIGNUP_LABEL) und Ihre eigene Notiz (DOC_MERGE).
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 – ANMELDEN
<!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>
<section aria-labelledby="signup-title">
<h2 id="signup-title">Try the demo form</h2>
<form id="signup-form" novalidate>
<label for="demo-email">Demo email</label>
<input id="demo-email" name="email" type="email" autocomplete="off" aria-describedby="signup-hint">
<p id="signup-hint">Use a fictional example.com address. Nothing is sent.</p>
<button type="submit">Check the address locally</button>
<p id="signup-result" role="status"></p>
</form>
</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>docs/temporary-review.md – DOC_NOISE
Temporary rehearsal note, deliberately dropped.index.html – SIGNUP_LABEL
<!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>
<section aria-labelledby="signup-title">
<h2 id="signup-title">Try the demo form</h2>
<form id="signup-form" novalidate>
<label for="demo-email">Fictional email address</label>
<input id="demo-email" name="email" type="email" autocomplete="off" aria-describedby="signup-hint">
<p id="signup-hint">Use a fictional example.com address. Nothing is sent.</p>
<button type="submit">Check the address locally</button>
<p id="signup-result" role="status"></p>
</form>
</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>docs/integration-note.md – DOC_MERGE
# Integration review
This note was written on main while signup work was private.In GitTree
Öffnen Sie die Palette mit Befehl+Umschalt+P (Strg+Umschalt+P bei Ubuntu). Aktionen für einen Commit verwenden das Rechtsklickmenü dieses Commits.
- Erstellen Sie die Grundlinie und die beiden Zweige, wie im nächsten Abschnitt gezeigt. Schauen Sie sich
release/labelan und bestätigen Sie, dass der Arbeitsbaum sauber ist. - Suchen Sie in der Grafik nach Priyas Commit „Fix: Klären Sie das fiktive E-Mail-Label“ und nicht nach der Notiz darunter. Wählen Sie es aus und lesen Sie seine Details: ein geänderter Pfad,
index.html, und sein übergeordnetes Element ist die nicht verwandte Notiz. - Klicken Sie mit der rechten Maustaste auf dieses Commit und wählen Sie Cherry-Pick Commit. Es gilt sofort für die Filiale, in der Sie sich befinden. Es gibt keine Filialauswahl. Der Befehl ist für den Commit deaktiviert, der bereits der aktuelle ist.
- Warten Sie auf das tatsächliche Ergebnis. Wenn ein Vorgang stoppt, verwenden Sie Resolve, Continue oder Abort… auf dem Banner, anstatt erneut auszuwählen.
- Wählen Sie den neuen Commit am
release/labelaus. Seine ID unterscheidet sich von der von Priya, der Autor ist Priya Nair und der Committer ist GitTree Demo. - Öffnen Sie
index.html: es ist SIGNUP_LABEL.docs/temporary-review.mdist nicht da und Ihr eigenesdocs/integration-note.mdist da.priya/labelbenennt immer noch seinen alten Tipp. - Lassen Sie
release/labelsauber. Nicht pushen und nicht zusammenführenpriya/label.
Wenn Sie zwei oder mehr Commits im Diagramm auswählen, bietet das Menü Cherry-Pick Commits an und kopiert sie der Reihe nach. Diese Lektion kopiert einen.
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
Erstellen Sie in einer separaten Kopie des Ergebnisses von Lektion 18 den Basiszweig, bevor Sie SIGNUP speichern:
git switch --create label-baseSpeichern Sie die Anmeldung als index.html, dann:
git add -- index.html
git commit --quiet -m "feat: prepare the shared signup baseline"
BASE_SHA="$(git rev-parse HEAD)"
git switch --create priya/labelSpeichern Sie DOC_NOISE als docs/temporary-review.md, dann:
git add -- docs/temporary-review.md
git commit --quiet -m "docs: unrelated source note"Speichern Sie SIGNUP_LABEL als index.html, dann:
git add -- index.html
git -c user.name="Priya Nair" -c user.email=priya@example.com commit --quiet -m "fix: clarify the fictional email label"
PICK_SHA="$(git rev-parse HEAD)"
git switch --create release/label "$BASE_SHA"Speichern Sie DOC_MERGE als docs/integration-note.md, dann:
git add -- docs/integration-note.md
git commit --quiet -m "docs: record target review"Wählen Sie nun den Fix aus und lesen Sie das Ergebnis:
git cherry-pick "$PICK_SHA"
git log -1 --format='%s%n%an <%ae>%n%cn <%ce>'
git diff-tree --no-commit-id --name-only -r HEAD
git status --shortfix: clarify the fictional email label
Priya Nair <priya@example.com>
GitTree Demo <demo@example.com>
index.htmlDie ID des neuen Commits unterscheidet sich von PICK_SHA, index.html ist SIGNUP_LABEL, docs/temporary-review.md fehlt und der Status ist leer. Zwei Variationen, die Sie kennen sollten, werden in separaten Kopien ausgeführt, niemals in der kanonischen: git cherry-pick -x "$PICK_SHA" fügt der neuen Nachricht die Zeile „(cherrypicked from commit …)“ hinzu, was bei der Auswahl gemeinsam genutzter Zweige hilfreich ist; und auf einem Ziel, dem das Anmeldeformular fehlt, stoppt derselbe Befehl mit einem Konflikt auf index.html, den Sie lösen (Lektion 23) oder mit git cherry-pick --abort verlassen. Wenn das Ziel die Änderung bereits hat, stoppt Git erneut mit einem leeren Pick und git cherry-pick --skip oder --abort ist der Ausweg.
Ergebnis
Where you end: release/label hat einen neuen Commit mit Priyas Fix, verfasst von Priya Nair und Commit von GitTree Demo, mit einer neuen ID. Die Seite hat die geklärte Bezeichnung, der unabhängige Hinweis ist nicht enthalten, priya/label und der Server sind unverändert und der Arbeitsbaum ist sauber.
Häufige Fehler
- Das Denken von Cherry-Pick verschiebt den Commit. Es kopiert die Änderung; das Original bleibt dort, wo es war.
- Den falschen Commit auswählen, die nicht verwandte Notiz anstelle des Fixes.
- Erzwingen eines leeren Commits, wenn die Änderung bereits im Zweig vorhanden ist.
- Verwenden Sie Cherry-Pick, um eine ganze Funktion Commit für Commit zu kopieren, anstatt sie zusammenzuführen.
Wenn etwas schief geht
Wenn die Auswahl stoppt, lesen Sie das Banner. Resolve und Continue beenden es wie in Lektion 23; Abort… gibt den Zweig dorthin zurück, wo er war. Wenn die Auswahl nach Abschluss ein Fehler war, erfolgt das neue Commit nur auf release/label: Machen Sie es dort rückgängig, und der Quellzweig wurde nie berührt.
Ü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
Melden Sie die ID, den Autor und den Committer des neuen Commits, seine geänderten Pfade und ob docs/temporary-review.md vorhanden ist. Sagen Sie dann voraus, was passiert, wenn Sie denselben Commit erneut für release/label auswählen.
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
- Cherry-Pick kopiert die Änderung eines Commits als neuen Commit.
- Das übergeordnete Element und die Commits davor bleiben zurück.
- Überprüfen Sie Abhängigkeiten und leere Picks, bevor Sie etwas erzwingen.
Verwandt
Glossarbegriffe eingeführt
Rosinenpickel – انتقاء; Quell-Commit – Quellcode; Ziel – الهدف; Abhängigkeit – اعتماد.
Videotranskript
Die Erzählung des Videos, Stichwort für Stichwort.
Zeigen Sie das Transkript
- Nehmen Sie einen Fix aus einem anderen Zweig und lass den Rest.
- Cherry-Pick kopiert die Änderung nach einem Commit gemacht, als neues Commit hier.
- Die Kopie hat eine neue ID, behält diese aber bei Autor und die Nachricht.
- Erstellen Sie eine Basislinie, Priyas Zweig mit a Hinweis und ein Fix sowie Ihr Release-Zweig.
- Öffnen Sie den Ordner. Die Grafik zeigt beides Zweige von derselben Grundlinie.
- Priyas Problem liegt auf einer anderen Lösung, die nichts damit zu tun hat Hinweis. Wir wollen nur die Lösung.
- Wählen Sie den Fix aus. Ein geänderter Pfad: index.html.
- Stellen Sie sicher, dass das Veröffentlichungsetikett aktuell ist Der Arbeitsbaum ist sauber.
- Klicken Sie mit der rechten Maustaste auf den Fix und wählen Sie Cherry-Pick-Commit.
- Es gibt keine Filialauswahl. Es gilt für der Zweig, in dem Sie sich befinden.
- Auf dem aktuellen Commit selbst der Befehl ist deaktiviert.
- Führen Sie es aus und warten Sie auf das tatsächliche Ergebnis.
- Ein neues Commit befindet sich auf dem Release-Label.
- Seine ID unterscheidet sich von der von Priya, weil es Eltern sind anders.
- Der Autor ist immer noch Priya. Der Committer bist du.
- Die Seite trägt die Kennzeichnung „geklärt“.
- Die unabhängige Notiz kam nicht mit. Ihre eigene Notiz ist noch hier.
- Priyas Filiale ist genau so, wie sie war.
- Geben Sie im Terminal ein Git-Protokoll mit einem Format ein zeigt den Betreff, den Autor und den Committer an.
- git diff-tree listet die Pfade dieses hier auf Commit geändert.
- Der Status ist leer. Nichts blieb übrig hinten.
- Mit der Option x wird die Nachricht aufgezeichnet woher die Auswahl kam.
- Wählen Sie denselben Commit erneut aus und Git stoppt: Der Pick ist leer.
- Ändern Sie die Eingabe: Das Ziel hat keine Anmeldung Formular.
- Die Auswahl endet mit einem Konflikt. Lösen und fortfahren oder abbrechen.
- Eine Änderung kann von Commits abhängen, die Sie nicht vorgenommen haben nehmen. Testen Sie das Ziel.
- Abort setzt den Zweig zurück. Die Quelle ist nie geändert.
- Übung: Melden Sie die neue ID, den Autor, Committer und Dateien.
- Als nächstes legen Sie unvollendete Arbeiten sicher beiseite mit Vorrat.