コンテンツにスキップ
GitTree

レッスン 11 · 日常の仕事

ページを置き換えずにチームメイトの変更を取得します

メイン、インデックス、元の作業ページを変更せずに、Leo の実際のフッター コミットを受け取ります。次に、サーバーの削除がローカルのクリーンアップと混同されないように、別のリプレイで stale-ref プルーニングを検査します。

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

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

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

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

何を学ぶか

  • フェッチされたリモート追跡参照は前進できるのに、メインは前進できない理由を説明してください。
  • 取得したフッターをチェックアウトしたり統合したりせずに比較します。
  • 作業ページに重複するローカル編集がある場合のフェッチ動作を予測します。
  • ローカルの古い参照の削除と、サーバーまたはローカル ブランチの削除を区別してください。

始める前に

レッスン 10 が終了したところから開始します。元の main/H6 がチェックアウトされ、docs/remotes.md を含む 6 つのコミット、クリーン、オリジン/main/H6 の追跡。別個のローカルベアオリジンには main/H6 のみがあります。機能/価格カード/F1 はローカルのままで、アップストリームや出版はありません。本物のビフォー/アフターをキャプチャするには、デモのバックグラウンド フェッチをオフにしておきます (repo.autoFetchInterval = 0)。レッスン 4 の補足クローンは使用しないでください。

チームメイトには新しい兄弟 gittree-features-leo を使用します。宛先がすでに存在する場合は停止します。すべてのリポジトリは、すべてのソース チェックアウトの外部にある、GitTree 機能の使い捨てコピーです。このビデオは、Ubuntu 24.04 の Git 2.52.0 と GitTree 2.0 を使用して録画されました。Leo のコミットとプッシュ、古い参照コピーの準備、チェックがターミナルで実行されました。フェッチ、グラフ、参照の比較、ファイル ビュー、プルーン リモートはアプリ内で実行されました。 macOS または Windows では何も実行されず、記録された Linux システムは Ubuntu だけです。 GitTree のソースフロアは Git 2.39.0 です。このローカル Git トランスポートには、プロバイダー、Pro/トライアル、または API 認証情報は必要ありません。

コンセプト

Fetch はオブジェクトを取得し、取得した知識を更新します。ここでは、サーバーのメインは Leo の H7 に進みますが、オリジナルのオリジン/メインはフェッチするまで H6 のままです。古いオリジン/メインに対するゼロビハインドカウントは、サーバーが変更されていないという証拠にはなりません。

フェッチ後、オリジン/メインの名前は H7 ですが、ローカルのメインと HEAD は H6 のままです。インデックスと作業ページも H6 のままです。フッターの差分の読み取りは検査であり、プル、チェックアウト、マージ、リベースではありません。 「背後にあるもの」は、異なるファイルや行の数ではなく、祖先を測定します。

Pull is fetch plus a second step. git pull はフェッチを実行し、到着したものを現在のブランチに統合します (早送り、マージ、またはリベース)。フェッチのみが前半で停止するため、ファイルを変更することはできません。レッスン 12 では、意図的に 2 番目のステップを選択します。

Pruning は、fetch/refspec ルールに従って、対応するサーバー ブランチがなくなったリモート追跡参照を削除します。それ自体はそのサーバー ブランチを削除したり、ローカル ブランチを消去したり、すべてのタグを削除したりしません。ソースの Fetch All リクエストではすでにプルーニングが有効になっています。したがって、以下のネイティブ同等物には --prune が含まれます。 Prune Remote は別個の名前付きリモート アクションであり、別個に準備された stale-ref コピーでのみ実証されます。

状態の影響

ステップオリジナルHEAD/メイン索引/作品原点/メイン別サーバーメイン
入力H6H6ページH6H6
Leo が自分のクローンからコミットしてプッシュするH6変わらないH6、現在は古いH7
オリジナルをすべて取得H6変わらないH7H7
差分を検査するH6変わらないH7H7

元のノートブックのコミットは追加されません。実際のプロジェクト操作は、フェッチされた参照更新です。ローカル フィーチャは依然として F1 を指しています。

完全なファイル入力

Leo のクローンの場合のみ、index.html を完全な最初の本文に置き換えます。彼の件名は docs: add Leo's review reminder です。著者/コミッショナー Leo Okafor <leo@example.com>。変更された入力本文は、2 番目の正規コミットではなく、別個のオリジナル コピーの作業編集です。

ファイルの抜粋 · 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">
    <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>
  </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>

個別のダーティフェッチリプレイ — HTML-DIRTY-FETCH

このフルボディは、別個の変更された入力リプレイ専用であり、正規のオリジナルではありません。

ファイルの抜粋 · 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">
    <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">Inspect the update before integrating it.</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>
  </main>
  <footer><p>Built by a fictional team for GitTree Learn.</p></footer>
  <script type="module" src="site.js"></script>
</body>
</html>

GitTreeで

  1. 元のメインタブを開きます。リポジトリの ID とクリーン ステータスを検査します。バックグラウンドフェッチのオーバーライドが 0 のままであることを確認します。前の状態がキャプチャされる前に、ソースのチェックアウトを変更したり、自動的にフェッチしたりしないでください。
  2. 以下の T1 を使用して Leo のクローンと正確なフッター コミットを準備し、明示的に native teammate preparation というラベルを付けます。彼のプッシュは、元のフェッチされたレコードではなく、ローカルのベアサーバーを更新します。ホストされたアカウントやシミュレートされたプロバイダーの応答は関係しません。
  3. フェッチする前に、T2 を実行します。 Main とorigin/main は、直接サーバー検索で実際の SHA が異なる場合でも、H6 では依然として一致します。作業ページには古いフッターがまだ残っています。
  4. Command+Shift+P (Ubuntu では Ctrl+Shift+P) でパレットを開き、Fetch All を 1 回選択します。 Command+Shift+F (Ctrl+Shift+F) がショートカットです。実際の操作と結果を待ちます。 「プル」をクリックしないでください。オリジンが 1 つある場合、右クリック origin → Fetch Remote は同等であり、2 番目に必要なフェッチではありません (撮影されていません)。
  5. グラフで新しく取得したコミット docs: add Leo's review reminder を選択し、実際のサブジェクトと Leo メタデータを検査します。ローカルの main/HEAD ラベルは以前のコミットのままになります。グラフ行の選択はチェックアウトではありません。
  6. パレット Compare References… が Compare References を開きます。 Old side = メイン; New side = 原点/メイン; What to compare = The two endpoints; Compareを選択します。フッターリマインダーが正確に追加された、i​​ndex.html のみを期待してください。このエンドポイント ツリーの比較では、マージベース/ログセットという用語を使用しないでください。
  7. Show Files (Command+Shift+E、Ubuntu では Ctrl+Shift+E);作業中のindex.htmlを選択してEnterします。フッターはオリジナルのままです。 Back to Graph を選択し、パレット Show Working Changes を選択します。ステージング済み/ステージングされていないリストは空のままです。ローカルでの保存、コミット、統合は必要ありません。
  8. メインで 6 つのコミット、オリジン/メインで 7、count0/1、クリーンな作業/インデックスで終了します。未公開のローカル フィーチャを保持します。無理にプッシュして遅れを「修正」しないでください。
  9. Separate stale-ref replay only: オリジナルではなく、以下の説明に従って B を準備します。最初にネイティブ プルーンのドライランを実行します。 New Tab (Ctrl+T) から B を開き、[最近のリポジトリ] の下にある Open gittree-features-prune 行を開きます。 B のタブで、サイド パネルの origin という名前を右クリック → Prune Remote します。アプリはそのアクションを直接ディスパッチします。プレビューや確認ダイアログは作成されません。ローカルの keep-stale とすべての作業バイトが残っている一方で、origin/practice/stale が消えることを観察します。

コマンド キーのコードはアプリのキーマップからのものです。 Ctrl フォームは Ubuntu で使用されていたものです。チームメイトとサーバーの準備は、アプリで作成されたホストされたプロジェクトではなく、ターミナルでのネイティブ作業です。

ターミナル内

明示的に -C コマンドを使用しない限り、以下のすべてのコマンドは original isolated gittree-features で始まります。ネイティブのオリジナルフェッチコマンドは、アプリアクションの後に繰り返されるミューテーションではなく、アプリアクションの代替手段です。

T1 — 実際のチームメイトの準備

Command · bash
git clone --quiet --branch main "$(git remote get-url origin)" ../gittree-features-leo
git -C ../gittree-features-leo config user.name "Leo Okafor"
git -C ../gittree-features-leo config user.email leo@example.com
git -C ../gittree-features-leo config commit.gpgsign false

新しいクローンが存在し、メインがチェックアウトされ、そのローカル ID のみが変更されます。そのクローンで、ファイル全体が HTML-LEO-FOOTER になるようにフッター行のみを変更します (ビデオでは、1 つの sed コマンドでこれを行っています。エディターで完全な本文を保存すると、同じファイルが得られます)。次に、次のようにします。

Command · bash
git -C ../gittree-features-leo add -- index.html
git -C ../gittree-features-leo commit --quiet -m "docs: add Leo's review reminder"
git -C ../gittree-features-leo push --quiet origin main

すべては静かに成功しました。これは、使い捨てのローカルのベアオリジンへの実際の G​​it プッシュです。インターネットアカウントや実稼働データには一切触れていません。

T2 — 古いローカル情報とサーバーの状態を区別する

Command · bash
git rev-list --left-right --count main...origin/main
git rev-parse refs/heads/main
git rev-parse refs/remotes/origin/main
git ls-remote --heads origin refs/heads/main

出力されたカウント:

出力
0	0

次の 2 つの SHA 出力は同じ H6 ID です。 ls-remote は、実際の異なる H7 SHA と refs/heads/main を出力します。 SHA はコミット メタデータによって異なるため、ここでは固定の偽ハッシュは出力されません。この直接サーバー クエリでは、origin/main は更新されません。

T3 — 統合せずにフェッチして検証する

Command · bash
git fetch --all --prune --quiet

観察: 出口 0、標準出力なし。 GitTree のソースは、このリクエストのプルーンを有効にします。コマンドはその選択を反映しています。

Command · bash
git symbolic-ref --short HEAD
git rev-list --count main
git rev-list --count origin/main
git rev-list --left-right --count main...origin/main
git log -1 --format="%s%n%an <%ae>%n%cn <%ce>" origin/main
git diff --name-only main origin/main
git status --short

最終ステータスの前に、グループ化された 3 行のメタデータ結果を出力します。

出力
main
6
7
0	1
docs: add Leo's review reminder
Leo Okafor <leo@example.com>
Leo Okafor <leo@example.com>
index.html

最終的な短いステータスは空の出口 0 です。メインの SHA、インデックス内の完全なindex.html、およびそのディスク全体のバイトは前後で比較され、同一のままでした。フェッチ検査もグラフ検査も H7 をチェックアウトしませんでした。

Command · bash
git diff main origin/main -- index.html

完全な観察された差分:

出力
diff --git a/index.html b/index.html
index eebd082..1e4cfde 100644
--- a/index.html
+++ b/index.html
@@ -34,7 +34,7 @@
       </div>
     </section>
   </main>
-  <footer><p>Built by a fictional team for GitTree Learn.</p></footer>
+  <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>

T4 — 変更された入力: ローカル ダーティ ページ

プリフェッチされたオリジナルの別の同じプロジェクトのコピーにのみ、ステージングなしで完全な HTML-DIRTY-FETCH を保存します。 Leo のサーバー H7 はすでに存在します。

Command · bash
git fetch --all --prune --quiet
git status --short
git show :index.html
git rev-list --left-right --count main...origin/main

フェッチは成功します。ステータス:

出力
 M index.html

完全な git show 出力は、古い作業版ではなく、古い記録/インデックス ファイルのままです。最終的なカウントは 0/1 です。作業ディスク ファイルは exactly HTML-DIRTY-FETCH のままです。ファイル名が重複しても、それ自体ではフェッチ競合は発生しません。後で統合するには異なる前提条件があります。このビデオでは、ファイル全体を印刷するのではなく、それぞれに grep -n 'hero-copy\|<footer>' を使用してインデックスと作業ファイルを比較します。リプレイ自身のチェックにより、作業ファイルが HTML-DIRTY-FETCH と等しいことが確認されました。

T5 — 古いリモート追跡参照、別個の B

サーバー main/H7 を使用して、分離された同じプロジェクト B のオリジナルと別の B ベアの宛先を作成します。測定されたファイル URL を使用して、その宛先に B only をポイントします。 A をリターゲットしないでください。

元のデモ フォルダーから、2 つの新しい存在しない兄弟宛先を準備します。これらのコマンドは、同じプロジェクトを B とその独自のサーバーに複製し、A を再ターゲットすることはありません。

Command · bash
git clone --quiet --bare --single-branch --branch main --no-local ../gittree-features-origin.git ../gittree-features-prune-origin.git
git clone --quiet --single-branch --branch main --no-local . ../gittree-features-prune
PRUNE_URL="$(node --input-type=module -e "import path from 'node:path'; import {pathToFileURL} from 'node:url'; console.log(pathToFileURL(path.resolve('../gittree-features-prune-origin.git')).href);")"
git -C ../gittree-features-prune remote set-url origin "$PRUNE_URL"
git -C ../gittree-features-prune config remote.origin.fetch '+refs/heads/*:refs/remotes/origin/*'
git --git-dir=../gittree-features-prune-origin.git branch practice/stale main
git -C ../gittree-features-prune fetch --prune --quiet origin
git -C ../gittree-features-prune branch keep-stale origin/practice/stale
git --git-dir=../gittree-features-prune-origin.git branch --delete --quiet practice/stale

単一ブランチ B クローンは、最初はメインのみをフェッチします。その明示的なremote.origin.fetch割り当てにより、元のデモのワイルドカードブランチマッピングが復元され、実践/古いものをフェッチできるようになります。 Bのみを変更します。準備コマンドが失敗した場合は停止します。実際のアプリが取得される前に、B のリポジトリ固有のバックグラウンドフェッチ間隔を 0 に設定します。使い捨てサーバー ブランチは存在しませんが、B にはフェッチされたレコードと別のローカル keep-stale ブランチがまだ存在します。次のコマンドは、B を明示的にターゲットにしています。

Command · bash
git -C ../gittree-features-prune remote prune --dry-run origin
git -C ../gittree-features-prune remote prune origin
git -C ../gittree-features-prune for-each-ref --format='%(refname)' refs/remotes/origin/practice/stale
git -C ../gittree-features-prune show-ref --verify --quiet refs/heads/keep-stale

変数 URL 行の後に preview excerpt が見つかりました:

出力
 * [would prune] origin/practice/stale

観察された execution excerpt:

出力
 * [pruned] origin/practice/stale

for-each-ref は空の exit 0 です。 show-ref はサイレント exit 0 であり、ローカルの keep-stale がまだ存在することを証明しています。 B のメイン SHA と作業ページは変更されません。サーバーメインはH7のままです。完全なネイティブ トランスクリプトには、プルーニングの起点と測定されたファイルの URL が含まれます。それらのマシン固有のパスはここでは作成されません。

stale-ref の準備とリモートのプルーニングの間に通常の Fetch All を挿入しないでください。Fetch All はすでにプルーニングされており、別のデモンストレーション用の古い候補は残りません。

結果

Where you end: のオリジナルの main/H6 は、6 つのコミットと古いフッターとともにチェックアウトされたままです。 Origin/main/H7 は、Leo の 7 番目のコミットを記録します。サーバー main/H7 はフェッチによって変更されません。 main は、origin/main をトラックし、1 つ後ろにあります。インデックス/作業はきれいです。 feature/pricing-cards/F1 はまだローカル/未公開です。 B/C ブランチ、ダーティ テキスト、およびプルーニングの準備は A から除外されます。追加の docs/fetch-and-prune.md コミットはありません。

よくある間違い

  • pre-fetch0/0 を呼び出すと、現在のサーバーの真実がカウントされます。
  • フェッチされたフッターが作業ページを自動的に置き換えることを期待します。
  • プルまたはチェックアウトを使用して、フェッチ記録が成功したように見せます。
  • 単にフェッチするだけでダーティ ページが破棄されるか競合することが期待されます。
  • プルーンは、リモートのリポジトリまたはローカルの keep-stale を削除するものとして解釈されます。

何か問題が発生した場合

フォルダーの欠落、間違った URL、またはアクセス許可の失敗は、履歴をリセットしたり宛先を上書きしたりするのではなく、意図した送信元と実際のエラーを検査することを意味します。ネットワーク/ヘルパー/信頼の拒否は、更新がゼロであるという証拠ではありません。実際のビルド/メッセージを記録し、記載された原因のみを解決します。制限付きモードでは転送が拒否される場合があります。レビュー済みの使い捨てラボのみを信頼し、フィルムを通過するランダムなリポジトリを決して信頼しないでください。

元のメインが移動した場合、またはフッターが変更された場合は、停止して、プル、チェックアウト、または外部編集が実行されたかどうかを検査します。原因を隠すためにハードリセットしないでください。新しいデモ チェックポイントを準備する前に、予期しない状態を保存してください。

古い参照が残っていない場合は、以前のすべてフェッチによって既に削除されているかどうかを確認してください。 Bを再準備します。消える行を作ったり、有用なサーバー ブランチを削除したりしないでください。

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

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

  1. 質問 1 / 6

    レオは H7 を押しましたが、フェッチしていません。オリジン/メインスチル名は何ですか?

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

  2. 質問 2 / 6

    どの観測値が正規フェッチ結果に属しますか?

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

  3. 質問 3 / 6

    フェッチした後、main has6 と、H6 を H7 の親とするorigin/main7 になります。メイン...原点/メインカウントとは何ですか?

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

  4. 質問 4 / 6

    入力を変更します。ステージングなしで HTML-DIRTY-FETCH を保存し、H7 をフェッチします。何が起こるのですか?

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

  5. 質問 5 / 6

    B のサーバー ブランチは削除されましたが、B にはorigin/practice/stale と local keep-stale があります。剪定すると何が除去されるのでしょうか?

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

  6. 質問 6 / 6

    どのチェックを一緒に行う必要がありますか?

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

6 個中 0 個が正解です

あなたは必須の質問にすべて正しく答えました。

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

練習する

フェッチ後の 2 つの元のページのバージョンを予測します。インデックスとワークは両方とも H6 のままですが、新しいリモート ツリーには Leo のフッターが保持されます。別のダーティ リプレイで、完全なディスク テキストが存続し、競合が発生していないことを確認します。 B では、keep-stale が枝刈りをしても生き残る理由を説明してください。オリジナルのみを clean0/1 チェックポイントで終了します。

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

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

要約

  • Fetch は、ブランチを統合せずにローカルの知識を更新します。
  • クリーンなステータスは、リモコンが最新であることを意味するものではありません。
  • ローカル追跡参照のプルーニングは、ローカル ブランチまたはサーバー ブランチの削除とは異なります。

用語集の用語の紹介

フェッチ — フェッチ;プルーン — تشذيب;古いリモート追跡参照 — مرجع تتبُّع بعيد قديم;後ろ — 重要;エンドポイントの比較 — 重要。

ビデオトランスクリプト

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

トランスクリプトを表示する
  1. アップデートを受信せずに 現在のページを置き換えます。
  2. バックグラウンドでの取得をオフのままにする この前後のテイクについて。
  3. レオの別のクローンを準備する 架空のローカルアイデンティティを持っています。
  4. Leo が記録してフッターをプッシュする 地元の原点を思い出させます。
  5. サーバーが移動中に、 取得したレコードが残った。
  6. これらのカウントはローカルで取得されたものを使用します ref、ライブサーバースナップショットではありません。
  7. どの審判が動くのか、そして どのファイルバージョンが残りますか?
  8. 設定されているすべてのリモートを取得します。 ここには原点しかない。
  9. Git の結果を待ってから アップデートを受信したものとして扱います。
  10. Leo のコミットの選択 それをチェックしません。
  11. main と取得したものを比較する どちらの参照も移動せずにツリーを作成します。
  12. 取り出した木にはリマインダーが付いています。 作業中のページはまだそうではありません。
  13. 元の作業ファイル は古いフッターを保持します。
  14. クリーンな作業変更は行われません。 ブランチが最新であることを意味します。
  15. 6 つのローカル コミット、7 つのローカル コミットを検証します。 コミットと 1 つを取得しました。
  16. 更新された知識を取得せずに ファイルの内容を統合します。
  17. 同じローカル編集 ファイルはこのフェッチでも存続します。
  18. サーバーブランチはすでに この剪定例の前に消えました。
  19. 古い追跡をプレビューする 削除する前に参照してください。
  20. 古いローカルトラッキングを削除する 地元の救助支部ではなく、参照。
  21. 地元の支店と 作業ページはそのまま残ります。
  22. 以前のフェッチにはすでに含まれている可能性があります 古い追跡参照を削除しました。
  23. オリジナルをきれいな状態で保管してください one;引っ張ったり、無理に押したりしないでください。
  24. 次に目的地を調べます ブランチを公開する前に。