コンテンツにスキップ
GitTree

レッスン 12 · 日常の仕事

早送り、マージ、またはリベースを使用してプルする

相違を検査した後、明示的なプル ポリシーを選択します。 3 つのコピーと 1 つの分離されたローカル サーバーを使用して、早送りのみの拒否、マージ、およびプライベート リベースを比較します。

このブラウザに進行状況が保存されました。

再生すると、YouTube からビデオが読み込まれます (プライバシー強化モード)。

英語ナレーション · English and Arabic 件のキャプション

動画ページを開くYouTubeで見る

何を学ぶか

  • フェッチとプル統合を分離します。
  • 3 つの明示的なポリシーの選択肢を比較します。
  • ffのみの拒否は政策の結果として認識します。
  • アップストリームおよび永続的なアプリのポリシー設定を確認します。

始める前に

レッスン 11 で終了したコース プロジェクトから開始し、main が Leo のフェッチされたコミットに到達します。そのコミット M を呼び出します。これにより、1 つの分岐の 3 つの通常のコピーが作成されます。1 つのコミット S を持つプライベート トピックと、1 つの異なるコミット N を持つサーバー ブランチ updated-main で、どちらも M 上にあります。プライベート トピックは最新でクリーンです。それぞれのオリジンは、updated-main/N を含む新しいベア サーバーのみを指し、origin/updated-main を追跡します。古い公開価格/メインリモコンは変更されていません。

このビデオは、Ubuntu 24.04 の Git 2.52.0 と GitTree 2.0 を使用して録画されました。分岐、レスキュー ブランチ、新しいサーバーはターミナルに構築されました。 3 つのプル、結果ビュー、ポリシー ファイル、およびプル モードの復元はアプリ内で実行されました。結果はターミナルで確認されました。 macOS または Windows では何も実行されず、記録された Linux システムは Ubuntu だけです。 GitTree のソース Git フロアは 2.39.0 です。

GitTree はサインインを求めます。無料プランでは、ここでのすべてのステップがカバーされます。プロバイダー アカウント、プロ/トライアル、API 認証情報、インターネット サービスは必要ありません。ローカルのベアオリジンは GitLab または CI ではありません。すべてのアイデンティティは example.com を使用します。このレッスンをソース チェックアウト内で実行しないでください。

両方を連続してではなく、同一の入力で GitTree またはネイティブ パスのいずれかを介してミューテーションを作成します。読み取り専用検証はどちらの後にも続きます。最終的な作業として説明される準備はすべて、ネイティブの準備としてラベル付けされており、決して発明されたアプリの機能ではありません。

概念と状態の効果

プルでは、選択した統合ポリシーが後にフェッチされます。これはリフレッシュと同義ではありません。後で ff-only がローカル ブランチの移動を拒否した場合でも、フェッチ フェーズで追跡参照が更新されることがあります。

分岐したプライベート S/N では、ff のみが拒否され、マージは両方のパスを保持し、リベースはフェッチされたベースでプライベート コミットを再生します。拒否を消すために黙ってモードを変更しないでください。

パレットのプル モード コマンドは、ワンショットの Git フラグではなく、アプリ全体の設定である general.pullMode を更新します。録音アプリで以前の設定を録音/復元します。以下のネイティブの明示的なプル フラグは、そのアプリ設定を変更しません。

各プルはサンドボックスの起点を取得します。 FF のみでは、トピック/インデックス/作品は S のままになります。マージとリベースは、独自のトピックとファイルのみを更新します。サーバー ブランチはプッシュされません。パレット ポリシーを選択すると、復元されるまでアプリ全体の設定も変更されます。

正確なプロジェクトの状態を準備する

レッスン 11 で残したクリーン コース プロジェクトの別の通常のコピーから開始します。元の gittree の機能は維持されます。このシナリオは、オリジナルまたはソース チェックアウトでは実行しないでください。 (コースの以前の計画では、後のマージ レッスンの結果からこのレッスンが開始されました。そのレッスンはまだ録画されていないため、ビデオではレッスン 11 のプロジェクトと同じ手順が使用されています。) 次に、以下の正確な準備を実行します。リポジトリローカルのデモ署名はオフになっており、チームメイトが明示的に指定されていない限り、GitTree デモ <demo@example.com> が ID となります。

完全なファイル入力

以下のフェーズでのみ保存します。これらは、最後に改行を含む完全な UTF-8/LF 本文です。 Markdown フェンスは決して貼り付けないでください。変更されていない実行可能ファイルは、名前付き入力を継承します。別のバリアントのバージョンでオリジナルを上書きしてはなりません。

Index.html — サインアップ

ファイルの抜粋 · 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/integration-note.md — DOC_MERGE

出力
# Integration review

This note was written on main while signup work was private.

docs/pull-policy.md — DOC_PULL

出力
# Pull policy

Fetch first and inspect ancestry.
Use fast-forward only when no integration decision is needed.
Merge preserves existing commit identities; rebase recreates private commits.
Never rewrite someone else's published work without coordination.

GitTreeで

パレット: Command+Shift+P (Ubuntu では Ctrl+Shift+P);正確な名前のコマンドを入力して選択します。名前付き参照アクションは、引数のないパレット ショートカットではなく、その行のコンテキスト メニューを使用します。

  1. 以下の 3 つの実際の分離コピーと独自のサーバー/アップストリームを準備します。ポリシーを選択する前に、以前のgeneral.pullModeを記録します。
  2. FF コピーの場合、パレット プル: 早送りのみ、ツールバーの Pull ボタン;本物の分岐拒否を待ちます。アプリの通知には「機能/サインアップ フォームは早送りできません」と書かれており、双方がコミットを行っており、もう一方がコミットしていないこと、何も変更されていないことが示され、Resolve… にマージ、リベース、またはリセットを提案しています。これは消去するまで保持されるため、次のコピーの前に消去してください。
  3. フェッチされたorigin/updated-mainが最新であっても、トピックのヒント/作業が変更されていないことを検査します。強制プッシュ…は押さないでください。
  4. 変更されていないマージ コピーで、[プル: 可能であれば早送り、そうでない場合はマージ] を選択し、ツールバーの [プル] ボタンを選択します。実際の 2 つの親の結果を検査します。
  5. 変更されていない Rebase コピーで、[Pull: Rebase]、[Pull] の順に選択します。現在のトピックはプライベートなので、自動スタッシュは必要ありません。
  6. N 上で再作成された S' を検証し、親をマージし、完全なツリーが等しいことを確認します。各結果を個別に保存します。
  7. 比較したスナップショットを保存した後でのみ、完全な DOC_PULL を docs/pull-policy.md として練習用コピーに保存します。ここではコミットしないままにしておきます。
  8. 録音アプリの以前のプル モードを明示的に復元します。自動プッシュまたはオリジナルのメイン変更が発生していないことを確認します。

すべての通常のコミット: 概要が記載された主題です。説明が空です。以前のコミットを修正し、フックをスキップし、サインオフ者を追加し、別の作成者を追加し、コミット後にプッシュし、空のコミットをオフに許可します。共著者はいません。指定したファイルのみをステージングし、N 個のファイルへの変更を 1 回コミットする (1 つのファイル)、または代わりに Command+Enter を押します。本当の結果を待ちましょう。明示的に修正するレッスンでは、指定されたオプションのみが変更されます。

ターミナル内

プロジェクトの別のクリーン コピーで、まず main を Leo の取得したコミット (つまり M) に移動し、次にプライベート トピックを作成します。

Command · bash
git merge --ff-only --quiet origin/main
git switch --create feature/signup-form

保存した SIGNUP ファイルをindex.html 上に置きます (ビデオではレッスンのファイルが ~/Downloads に保存され、cp ~/Downloads/SIGNUP.html index.html が使用されます)、次の操作を行います。

Command · bash
git add -- index.html
git commit --quiet -m "feat: add the local signup demonstration"
git branch rescue/signup-before-rebase
BASE_SHA="$(git rev-parse HEAD~1)"
git switch --quiet --create updated-main "$BASE_SHA"

updated-main で DOC_MERGE を docs/integration-note.md (cp ~/Downloads/DOC_MERGE.md docs/integration-note.md) に配置し、次のようにします。

Command · bash
git add -- docs/integration-note.md
git commit --quiet -m "docs: add the integration review"
git switch --quiet feature/signup-form

BASE_SHA は、プライベート サインアップのコミット前に測定された M 親です。 topic と updated-main の両方に 1 つの独立したコミットが含まれるようになりました。 rescue/signup-before-rebase は古いトピックを保持します。このトピックに関する内容は何も公開されていません。

そのリベース前のコピーから、N のみを含む new サーバーを準備します。

Command · bash
git clone --quiet --bare --single-branch --branch updated-main --no-local . ../gittree-pull-origin.git

Git/アプリ操作がアクティブでないときに cp -R <source-demo-copy> <new-copy> を使用して同じ入力の通常のコピーを 3 つ作成するか、.git を保存した同等の検証済みのファイル システム コピーを作成します。各コピーで、origin をその新しいサーバーの測定されたファイル URL に置き換え、トピックを取得してアップストリームに設定します。元のターゲットを再ターゲットしないでください。

Command · bash
git remote set-url origin "<measured-file-url>"
git fetch --quiet --prune origin
git branch --set-upstream-to=origin/updated-main feature/signup-form

プレースホルダーの代わりに、測定されたファイルの URL を使用します。 FFコピーでは:

Command · bash
git pull --quiet --ff-only origin updated-main

出口128を測定。診断の抜粋:

出力
hint: Diverging branches can't be fast-forwarded, you need to either:
hint:
hint: 	git merge --no-ff
hint:
hint: or:
hint:
hint: 	git rebase
hint:
hint: Disable this message with "git config set advice.diverging false"
fatal: Not possible to fast-forward, aborting.

別の Merge コピーでは次のようになります。

Command · bash
git pull --quiet --no-rebase --no-edit origin updated-main

別の Rebase コピーで:

Command · bash
git pull --quiet --rebase origin updated-main

どちらも成功しました。実際の最終ツリー ID は一致し、マージには 2 つの親があり、1 つが再生されました。それぞれの検査について:

Command · bash
git rev-list --parents -n 1 HEAD
git rev-parse 'HEAD^{tree}'
git status --short

SHA はさまざまです。ステータスは、オプションのポリシー ファイルを実行する前はクリーンでした。ブランチをプッシュするコマンドはありません。

結果

Where you end: FF のみのコピーはフェッチ後に拒否されて S に残ります。コピーをマージすると、2 つの親の統合が追加されます。リベース コピーは N に S' を作成します。マージ/リベース ツリーは一致します。プッシュはありません。比較後にのみ、ポリシー ファイルをコミットされていない実践として保存します。

よくある間違い

  • 直線のグラフは、古いコミット ID が残っていることを意味すると仮定します。
  • 代替ペインを元のチェックポイントとして扱います。
  • アプリが成功した後、完了したミューテーションを繰り返します。

何か問題が発生した場合

FF の拒否はデータの損失ではありません。フェッチされた/ローカル参照を検査し、そのコピーに対してレビュー済みのポリシーを選択します。マージ/リベースが停止した場合は、解決/続行するか、明示的に中止します。アクティブな操作に対して別のプルを実行しないでください。

理解度を確認してください

各質問に答えてから、その理由を読みましょう。 「必須」とマークされた質問は、レッスンの完了にカウントされます。

  1. 質問 1 / 6

    ここでのプルとは何ですか?

    答えを 1 つ選択してください。

  2. 質問 2 / 6

    ffのみ拒否すると何が起こるのでしょうか?

    当てはまるものをすべて選択してください。

  3. 質問 3 / 6
    必須

    N: 結果の親へのプライベート リプレイ?

    答えを 1 つ選択してください。

  4. 質問 4 / 6
    必須

    現在の作業を公開済みの共有トピックに変更します: リベースはまだ自動アドバイスですか?

    答えを 1 つ選択してください。

  5. 質問 5 / 6

    パレット ポリシー コマンドは 1 つのプルのみを変更しますか?

    答えを 1 つ選択してください。

  6. 質問 6 / 6
    必須

    比較を証明するものは何ですか?

    当てはまるものをすべて選択してください。

6 個中 0 個が正解です

必須の質問に正しく答えると、レッスンを完了できます。

このブラウザで確認しました。

練習する

拒否されたコピーでどの状態が変化したかを説明し、成功した 2 つのツリーと親を比較してから、完全な DOC_PULL ポリシーを作成します。録音アプリの設定が復元されたことを確認します。

あなた自身の確認: サイトはあなたのコンピュータを認識できません。

レッスンを完了するには、必須の質問に正しく答え、実践的な演習を確認してください。

要約

  • プルには統合ポリシーが含まれます。
  • フェッチが成功した後に拒否が発生する場合があります。
  • ポリシーの永続性には明示的なレビューが必要です。

用語集の用語の紹介

リベース — 再ベース;リプレイ — إعادة تطبيق;レスキュー審判 — مرجع حفظ。

ビデオトランスクリプト

ビデオのナレーションが次々と流れます。

トランスクリプトを表示する
  1. 正確なチェックポイントから開始します。
  2. ブランチとインデックスに名前を付けます そして作業バージョン。
  3. 分離されたコースのコピーのみを準備します。
  4. 上流に名前を付けて、 3 つの入力をすべて保持します。
  5. 早送りはこの発散を拒否するだけです。
  6. フェッチが成功した後に拒否が発生する場合があります。
  7. マージ ポリシーは両方の履歴を保存します。
  8. プライベート トピックのみを再生します。
  9. 両親を比較して、 ツリーを個別に完成させます。
  10. その後、レビューしたプル ポリシーを作成します。
  11. 以前のアプリ全体のポリシーを復元します。
  12. ここでのプルとは何ですか?
  13. プルにはトランスポートフェーズがあり、 政策に基づいたローカル段階。
  14. ffのみ拒否すると何が起こるのでしょうか?
  15. Fetch can finish before 統合は発散を拒否します。
  16. N: 結果の親へのプライベート リプレイ?
  17. マージ K とは異なり、リベースは N に S' を作成します。
  18. 現在の作業を公開済み共有に変更します トピック: リベースはまだ自動アドバイスですか?
  19. 個人のみの仮定はもはや当てはまりません。
  20. パレットポリシーコマンド 1 回のプルだけを変更しますか?
  21. ソースはgeneral.pullModeを書き込みます 別の選択がそれを回復するまで。
  22. 比較を証明するものは何ですか?
  23. むしろ実際の状態を比較してください 沈黙を命令するよりも。
  24. 実際の結果を検証してみると、 単なるメッセージではありません。
  25. 行動する前に、変更された入力を予測します。
  26. リカバリする前に有用な作業を保存します。
  27. 続行する前にチェックポイントを証明してください。
  28. 検証結果を保存する 次のステップのために。