レッスン 25 · 歴史と統合
選択したコミットをチェリーピックで適用する
1 人のチームメイトの修正を、ブランチ全体をマージせずにリリース ブランチにコピーし、新しいコミット、その作成者、そのファイル、および何が残っているかを確認します。
- レベル: 中級者
- 5 分で読みました
- 5 分の動画
- 更新されました
- このレッスンの前に: HEADを移動せずに履歴を読み取る, マージとリベースの競合を解決する
このブラウザに進行状況が保存されました。
再生すると、YouTube からビデオが読み込まれます (プライバシー強化モード)。
何を学ぶか
- コピーするコミットを 1 つ選択し、その親が存在しない理由を確認してください。
- 新しいコミットの ID、作成者、コミッターを予測します。
- 何かを強制する前に、欠落している依存関係またはすでに適用されている変更を認識してください。
- 結果をソース ブランチと照合して確認します。
始める前に
Priya のブランチ priya/label は、共有ベースライン B (サインアップ ページ) を超える 2 つのコミットを保持します。 1 つ目は、docs/temporary-review.md を追加する無関係なメモ「docs: 無関係なソース メモ」です。 2 つ目は、彼女の修正「修正: 架空のメール ラベルを明確にする」です。これにより、index.html のラベルが変更されます。ブランチ release/label は同じベースライン B から始まり、独自のコミット「docs: レコード ターゲット レビュー」が 1 つあり、これにより docs/integration-note.md が追加されます。 release/label はチェックアウトされており、ワークツリーはクリーンです。あなたは彼女に自分のブランチを修正してもらいたいのですが、彼女のメモは望んでいません。
すべてがローカルであり、無料プランです (GitTree はサインインを要求します)。ホスティング アカウント、プロバイダー、インターネットはありません。すべてのアイデンティティは架空のものです (example.com)。このレッスンを実際のプロジェクトで実行しないでください。
変更は、GitTree 内で行うか、ネイティブ Git コマンドを使用して行います。同じコピー内で両方を行うことはできません。結果の読み取りは常に安全です。メニュー ラベルは GitTree 2.0 独自の文字列から取得され、ネイティブ コマンドは使い捨てコピーの Git 2.43 で実行されました。 GitTree ステップは macOS、Windows、または Linux で実行されませんでした。
概念と状態の効果
Cherry-pick は、1 つのコミットが行った変更をその親と比較して取得し、それを new コミットとして現在のブランチに適用します。親は取得されず、その前にコミットも取得されません。まさにそれが、プリヤの修正を取り入れて彼女のメモを残すことができる理由です。
ソースコミットには触れません。新しいコミットには新しい親があるため、新しい ID を持ちますが、元の作成者とメッセージは保持されます。コミッター、つまりこのコミットを行った人はあなたです。同じメッセージで同じ変更を行っても、別のコミットになります。
依存関係は依然として重要です。この修正によりサインアップ フォームの行が編集されるため、ターゲット ブランチにはそのフォームがすでに存在している必要があります。そうでない場合、Git は競合して停止します。ターゲットに同じ変更が既に含まれている場合、ピックは空になり、Git は再び停止します。どちらの場合も、操作の内容を確認してください。それを通過するためだけに空のコミットを強制しないでください。
対象のブランチのみが移動します。 priya/label とサーバー上のすべてのものはそのまま残ります。新しいコミットは、ラベルの変更を release/label に追加するだけで、他には何も追加しません。
正確なプロジェクトの状態を準備する
レッスン 18 で残したプロジェクトの別の通常のコピーから開始し、元の gittree-features はそのままにしておきます。 SIGNUP をベースラインとして保存し、2 つのブランチを構築します。以下の本文は、ベースライン ページ (SIGNUP)、無関係のメモ (DOC_NOISE)、固定ページ (SIGNUP_LABEL)、および独自のメモ (DOC_MERGE) です。
完全なファイル入力
以下のフェーズでのみ保存します。これらは、最後に改行を含む完全な UTF-8/LF 本文です。 Markdown フェンスは決して貼り付けないでください。変更されていない実行可能ファイルは、名前付き入力を継承します。別のバリアントのバージョンでオリジナルを上書きしてはなりません。
Index.html — サインアップ
<!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.GitTreeで
Command+Shift+P (Ubuntu では Ctrl+Shift+P) でパレットを開きます。コミットに対するアクションでは、そのコミットの右クリック メニューを使用します。
- 次のセクションで示すように、ベースラインと 2 つのブランチを構築します。
release/labelをチェックアウトし、ワークツリーがクリーンであることを確認します。 - グラフ内で、その下のメモではなく、Priya のコミット「修正: 架空のメール ラベルを明確にする」を見つけてください。それを選択して詳細を読みます。1 つの変更されたパス
index.htmlとその親は無関係なメモです。 - そのコミットを右クリックして、Cherry-Pick Commit を選択します。これは、現在いるブランチにすぐに適用されます。ブランチピッカーはありません。このコマンドは、すでに現在のコミットでは無効になっています。
- 本当の結果を待ちましょう。操作が停止した場合は、再度選択する代わりに、バナー上で Resolve、Continue、または Abort… を使用します。
release/labelの新しいコミットを選択します。 ID は Priya とは異なり、作成者は Priya Nair、コミッターは GitTree Demo です。index.htmlを開きます: SIGNUP_LABEL です。docs/temporary-review.mdは存在しませんが、自分のdocs/integration-note.mdは存在します。priya/labelは依然として古いチップに名前を付けています。release/labelをきれいなままにしておきます。priya/labelをプッシュしたりマージしたりしないでください。
グラフ内で 2 つ以上のコミットを選択すると、メニューに Cherry-Pick Commits が表示され、それらが順番にコピーされます。このレッスンではその 1 つをコピーします。
コース内のすべての通常のコミット: Summary は指定された件名、Description は空、オプション Amend Previous Commit、Skip Hooks、Add Signed-off-by、Different Author、Push After Commit、および Allow Empty Commit はオフのままです。
ターミナル内
レッスン 18 の結果の別のコピーで、SIGNUP を保存する前にベースライン ブランチを作成します。
git switch --create label-baseサインアップを index.html として保存し、次のようにします。
git add -- index.html
git commit --quiet -m "feat: prepare the shared signup baseline"
BASE_SHA="$(git rev-parse HEAD)"
git switch --create priya/labelDOC_NOISE を docs/temporary-review.md として保存し、次のようにします。
git add -- docs/temporary-review.md
git commit --quiet -m "docs: unrelated source note"SIGNUP_LABEL を index.html として保存し、次のようにします。
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"DOC_MERGE を docs/integration-note.md として保存し、次のようにします。
git add -- docs/integration-note.md
git commit --quiet -m "docs: record target review"次に、修正を選択して結果を読んでください。
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.html新しいコミットの ID は PICK_SHA とは異なり、index.html は SIGNUP_LABEL で、docs/temporary-review.md は存在せず、ステータスは空です。知っておくべき 2 つのバリエーションは、正規コピーでは決して実行せず、別々のコピーで実行します。 git cherry-pick -x "$PICK_SHA" は、新しいメッセージに「(cherry pick from commit …)」という行を追加します。これは、共有ブランチ間で選択するときに役立ちます。サインアップ フォームのないターゲットでは、同じコマンドが index.html で競合して停止します。競合を解決するか (レッスン 23)、または git cherry-pick --abort で終了します。ターゲットにすでに変更がある場合、Git は空のピックで再び停止し、git cherry-pick --skip または --abort が解決策となります。
結果
Where you end: release/label には、Priya Nair によって作成され、新しい ID を持つ GitTree Demo によってコミットされた、Priya の修正を含む新しいコミットが 1 つあります。ページには明確なラベルがあり、無関係なメモは添付されておらず、priya/label とサーバーは変更されておらず、ワーク ツリーはクリーンです。
よくある間違い
- チェリーピックを考えてコミットを移動します。変更をコピーします。オリジナルは元の場所に残ります。
- 間違ったコミットを選択し、修正ではなく無関係なメモを選択します。
- 変更がすでにブランチ上にある場合に空のコミットを強制します。
- チェリーピックを使用して、機能全体をマージするのではなく、一度に 1 つのコミットずつコピーします。
何か問題が発生した場合
ピックが停止した場合は、バナーを読んでください。 Resolve と Continue はレッスン 23 と同様に終了します。 Abort… はブランチを元の場所に戻します。完了後の選択が間違っていた場合、新しいコミットは release/label 上にのみ存在します。そこで元に戻してください。また、ソース ブランチにはまったく触れられていません。
理解度を確認してください
各質問に答えてから、その理由を読みましょう。 「必須」とマークされた質問は、レッスンの完了にカウントされます。
6 個中 0 個が正解です
必須の質問に正しく答えると、レッスンを完了できます。
このブラウザで確認しました。
練習する
新しいコミットの ID、作成者とコミッター、変更されたパス、および docs/temporary-review.md が存在するかどうかを報告します。次に、同じコミットを再度 release/label に選択した場合に何が起こるかを予測します。
あなた自身の確認: サイトはあなたのコンピュータを認識できません。
レッスンを完了するには、必須の質問に正しく答え、実践的な演習を確認してください。
要約
- チェリーピックは、1 つのコミットの変更を新しいコミットとしてコピーします。
- 親とその前のコミットが残ります。
- 何かを強制する前に、依存関係と空のピックを確認してください。
関連している
用語集の用語の紹介
チェリーピック — انتقاء;ソースコミット — ソースコミット。ターゲット - ターゲット。依存関係 — عتماد。
ビデオトランスクリプト
ビデオのナレーションが次々と流れます。
トランスクリプトを表示する
- 別のブランチから修正を 1 つ取り込み、 残りは放っておいてください。
- チェリーピックは変更を 1 つのコミットにコピーします ここで新しいコミットとして作成されました。
- コピーには新しい ID が付けられますが、 作者とメッセージ。
- ベースライン、Priya のブランチを構築します。 メモと修正、リリース ブランチ。
- フォルダーを開きます。グラフには両方が示されています 同じベースラインから分岐します。
- Priya の修正は無関係なものの上に置かれています 注意してください。修正だけが必要です。
- 修正を選択します。変更されたパスの 1 つ: インデックス.html。
- リリース ラベルが最新のものであることを確認し、 ワークツリーはきれいです。
- 修正を右クリックして、 チェリーピックコミット。
- ブランチピッカーはありません。該当するのは あなたがいるブランチ。
- 現在のコミット自体で、コマンド 無効になっています。
- 実行して、実際の結果を待ちます。
- 新しいコミットはリリース ラベルに配置されます。
- その ID は Priya とは異なります。 親が違います。
- 作者はやはりプリヤです。コミッター あなたです。
- ページには明確なラベルが付けられています。
- 無関係なメモは来ませんでした。 あなた自身のメモはまだここにあります。
- プリヤのブランチはそのままです。
- ターミナルで、次の形式の git log を実行します。 件名、作成者、コミッターを示します。
- git diff-tree はこのパスをリストします コミットが変更されました。
- ステータスは空です。何も残らなかった 後ろに。
- x オプションを使用すると、メッセージが記録されます ピックがどこから来たのか。
- 同じコミットを再度選択すると、Git が停止します。 ピックは空です。
- 入力を変更します: ターゲットにはサインアップがありません 形。
- ピックは競合して停止します。解決する 続行するか中止します。
- 変更は、あなたが行っていないコミットに依存する可能性があります 取る。ターゲットをテストします。
- 中止するとブランチが元に戻ります。ソースは 決して変更されません。
- 練習: 新しい ID、作成者、 コミッターとファイル。
- 次に、未完了の仕事を安全に脇に置きます 隠し場所付き。