コンテンツにスキップ
GitTree

レッスン 3 · 基礎

次のコミットに何が含まれるかを予測する

編集中のファイルを、コミット用に準備されたスナップショットおよび記録された履歴から分離します。 Use the future GitTree Features hero to explain why one file can be both staged and modified.

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

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

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

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

何を学ぶか

  • 作業ツリー、インデックス、最後に記録されたコミットを区別します。
  • ステージング、編集、通常のコミットの変更を予測します。
  • ステージングされた状態が永久に保存されることを意味すると仮定せずに、短いステータスの両方の列を読んでください。
  • ステージングされていない変更とステージングされた変更には個別の比較を使用します。

始める前に

まずレッスン 1 を読んでください。レッスン 2 では、Git とコミット ID を準備します。 no course repository から始めて何もなく終了します。これは概念のレッスンです。最初の実践的な初期化は、GitTree 内のレッスン 4 です。

このレッスンでは、レッスン 5 で作成する 4 つの状態をプレビューします。以下のターミナル出力とビデオ内の GitTree 画面は、将来のプロジェクトの使い捨てコピーからのものです。コマンドと画面は、Ubuntu 24.04 の Git 2.52.0 および GitTree 2.0 で記録されました。これらは macOS には実行されませんでした。ビデオ内のそのようなシーンにはすべて「将来のレッスン 5 プレビュー」というラベルが付いています。無関係な作業リポジトリで将来の状態のコマンドを実行したり、追加の練習リポジトリを今すぐ初期化したりしないでください。プレビューを見て読み、レッスン 5 がこれらの状態に達したらクエリを繰り返します。

GitTree の検査済みの最小値は Git 2.39.0 です。 macOS では、Command キーを押します。Windows と Linux では Ctrl キーを使用します。コマンドは Windows で実行されませんでした。ローカル モデルにはプロバイダー、アカウント、Pro、トライアルは必要ありません。

コンセプト: 1 つのファイルの移動ではなく、3 つの場所

working tree はディスク上のプロジェクト ファイルです。ファイルを編集して保存すると、これらのバイトが変更されます。 Git は必ずしもコミットのためにそれらを選択しているわけではありません。

index は、staging area とも呼ばれ、準備中の次のスナップショットを記述します。ファイルをステージングすると、現在の内容からインデックス エントリが更新されます。後の編集に対する永久的なサブスクリプションではありません。

commit は、ツリーとメタデータおよび親関係を記録します。 HEAD は、通常はチェックアウトされたブランチを通じて、現在の位置を識別します。最初のコミットの前に、ブランチ コミットが存在しない場合でも、HEAD は未誕生のブランチに名前を付けることができます。

役立つ例えは、作業草案、準備版、および記録版です。この例えを文字通りに受け取らないでください。ステージングでは作業ファイルの移動や削除は行われません。通常の追跡パスでは、3 つのバージョンが独立して一致することも、異なることもあり得ます。

準備されたインデックス、without -a、明示的なパス引数、自動ステージングまたは修正の通常のコミットを使用します。他のコミット モードは、この例と互換性がありません。 Git の追加リファレンス では、ステージング時のスナップショットの動作について説明しています。 diff 参照 は比較を区別します。

まさに未来の例

ファイルは index.html です。タイトルは Understand every change. のままです。そのサポートラインには 2 つのバージョンがあります。

ファイルの抜粋 · html
<p id="hero-copy">A clear view of Git history.</p>

その後の作業編集:

ファイルの抜粋 · html
<p id="hero-copy">Choose one change, then check what Git saved.</p>

これらは、プロジェクトの元のページ全体と編集されたページ全体からの行の抜粋であり、ページ全体に貼り付ける置換ファイルではありません。

将来の状態最後のコミットインデックス作業ファイルIndex.html の短いステータス
A: ファイルを作成するコミットなし立ち入り禁止オリジナルページ?? index.html
B: ステージデモファイルコミットなしオリジナルページオリジナルページA index.html
C: ステージング後の編集コミットなしオリジナルページ編集されたページAM index.html
D: インデックスをコミットするオリジナルページオリジナルページ編集されたページ M index.html

完全なプロジェクトには README も含まれています。どちらのファイルも最初のコミットの前にステージングされます。ステータスの例は、index.html に限定されています。 D では、README はクリーンであり、index.html は意図的にステージングされていない編集を維持しています。

ここで競合していない通常の行の場合、short status の最初の列はインデックスと HEAD を比較します。 2 つ目は作業ツリーをインデックスと比較します。 ?? は特別な追跡されていないマーカーであり、通常の 2 つの変更列ではありません。 M の先頭のスペースが重要です。

何が変わるのか

  • Stage: はインデックスの内容を更新します。コミットやブランチの移動、作業ファイルの書き換えはありません。
  • Edit after staging: は作業バイトのみを更新します。準備されたインデックスは以前のバージョンのままです。
  • Normal commit: は、準備されたスナップショットを記録し、現在のローカル ブランチを更新します。インデックスはそのスナップショットのままです。無関係な後の作業編集が残ります。
  • Remote: これらのローカル ステップでは、リモート追跡参照のプッシュ、フェッチ、または作成は行われません。この例にはリモコンがありません。

インデックスは単なる名前のリストではありません。高度な競合では、複数のインデックス ステージが保持される場合があります。ここでは、未解決のマージではなく、通常のステージ ゼロのファイル エントリをモデル化しています。

ターミナル内 — 今後のチェックポイントをプレビューする

Do not execute these in the still-uninitialized learner project. これらは、完全な README とページの両方のバージョンを保持する使い捨てコピーで実行されました。レッスン 5 では、実際の作成とステージングの手順を説明します。

将来の状態 C で、2 つのバージョンを検査します。

Command · bash
git status --short -- index.html

観察された内容:

出力
AM index.html

準備されたファイルを直接読み取ります。

Command · bash
git show :index.html

観察された full output:

出力
<!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>
</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">Understand every change.</h1>
      <p id="hero-copy">A clear view of Git history.</p>
    </section>
  </main>
  <footer><p>Built by a fictional team for GitTree Learn.</p></footer>
</body>
</html>

作業ツリーをインデックスと比較します。

Command · bash
git diff -- index.html

観察された内容:

出力
diff --git a/index.html b/index.html
index 5470374..27f8718 100644
--- a/index.html
+++ b/index.html
@@ -13,7 +13,7 @@
     <section class="hero" aria-labelledby="hero-title">
       <p class="eyebrow">GitTree Learn demo project</p>
       <h1 id="hero-title">Understand every change.</h1>
-      <p id="hero-copy">A clear view of Git history.</p>
+      <p id="hero-copy">Choose one change, then check what Git saved.</p>
     </section>
   </main>
   <footer><p>Built by a fictional team for GitTree Learn.</p></footer>

上記のオブジェクトの略語は、これらの正確な LF ファイル本体からの実際のファイル BLOB ID であり、作成されたコミット SHA ではありません。省略形の長さ/出力は構成によって異なる場合があります。

最初のコミット前の空の履歴を基準にして、段階的な追加を検査します。

Command · bash
git diff --cached --stat -- index.html

観察された内容:

出力
 index.html | 21 +++++++++++++++++++++
 1 file changed, 21 insertions(+)

--stat は要約します。内容のレビューではありません。完全なステージングされたスナップショットは、git show :index.html で示されている以前のファイルです。

未来の状態 D で、何が記録されたかを確認する

レッスン 5 の準備されたインデックスの通常のコミット後:

Command · bash
git log -1 --format=%s
git status --short -- index.html
git diff --cached -- index.html

最初の 2 つの出力を順番に観察します。

出力
feat: add the GitTree Features hero
 M index.html

3 番目のコマンドは no output を出力し、正常に終了します。インデックスと HEAD がこのパスに一致します。作業ツリーがクリーンであるという意味ではありません。作業差分には、上記のサポートライン編集がまだ表示されています。これは、「コミットが最新の編集を見逃した」という一般的な理由であり、実際には正しい Git 動作です。

GitTreeで

現在のリポジトリのないコンテキストでは

  1. 必要に応じて、Command+T / Ctrl+T (tab.new) を使用して、New Tab を開いたままにしてください。
  2. macOS または Alt+H で Option+H を使用して Feature Guide を開くか、Command+Shift+P / Ctrl+Shift+P で Command Palette… を開き、Feature Guide を選択します。
  3. Features で、Search features に stage と入力し、Stage and commit と読みます。初期化アクションを実行しないでください。カードは方向性を示すものであり、ステージングされたファイルの証拠ではありません。
  4. Escape を押してガイドを閉じます。コース リポジトリはまだ存在しません。

GitTree の同じ状態 (ビデオで示されています)

このビデオでは、「将来のレッスン 5 プレビュー」というラベルが付いた、GitTree の将来のプロジェクトの使い捨てコピーが開きます。これはあなたのプロジェクトではなく、あなたの仕事の記録でもありません。

  1. C で、Command Palette… を開き、「Show Working Changes」と入力して、その正確なコマンド (wip.show) を選択します。このコマンドに対してアサートされたデフォルトのショートカットはありません。
  2. 右側のパネルの Unstaged Files と Staged Files を調べます。 index.html は 2 つの異なる比較があるため、両方に表示されます。 2 つの物理ファイルではありません。
  3. Unstaged Files 内のその行をクリックします。中央の差分には、サポートラインの変更を含め、元のページが編集されたページに変化していることが示されていることが予想されます。
  4. Staged Files 内のその行をクリックします。初期のサポートラインを含む段階的な追加が期待されます。いずれかの行を検査するだけでは、何もステージングまたはステージング解除されません。
  5. D では、通常のコミットの後、グラフに最初のコミットがあります。 Staged Files は Nothing is staged. A commit contains only staged changes. と言っています 作業中の編集は Unstaged Files に残ります。
  6. このコンセプト プレビューで not をクリックして、Stage File、Unstage File、Stage All Changes、または Discard Changes… をクリックします。専用の作成とコミットの手順はレッスン 4 と 5 に続きます。

結果

C から D を予測できます。最初のコミットは前のサポート行を記録しますが、後の作業編集は残ります。自分のプロジェクトはリポジトリなしの状態のままです。今後のプロジェクトのグラフは、完成した作業ではなく、明示的にラベルが付けられたプレビューです。

よくある間違い

  • “Staged means all future edits are included.” これは、その時点で選択されたバージョンがインデックスに含まれていることを意味します。
  • “Empty cached diff means no edits.” インデックスと HEAD が選択されたパスに一致すると表示されます。動作差分も調べてください。
  • “Two lists mean two files.” これらは、同じパスに対する 2 つの比較です。
  • “A staged file is safely committed.” インデックスは変更可能です。それは永続的な履歴やバックアップではありません。
  • “Commit means remote update.” この例にはリモートが存在しないため、プッシュは発生しません。

何か問題が発生した場合

ここでリポジトリ クエリを実行して「git リポジトリではありません」と表示された場合は、レッスン チェックポイントをそのままにしてプレビューを読んでください。サンプル コマンドを成功させるために 2 番目のリポジトリを作成しないでください。

後で自分のプロジェクトに別のステータスが表示された場合は、修復を試みる前に、選択したパスを調べてください。編集後に再度上演したんですか?これにより、準備されたスナップショットが変更され、予測されたコミットが変更されます。自動ステージ コマンドを使用しましたか?これは、通常のインデックスのみのコミットとは異なる操作です。

この段階では、コンテンツを破壊するのではなく、適切な比較を特定することで回復します。レッスン 5 では、安全なステージングの決定を示し、リカバリ パスではスコープ チェックされた Undo と reflog について説明します。 GitTree 個のゴミ箱スナップショットは、任意のエディターで保存されたすべてのファイルが復元可能であることを保証するものではありません。

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

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

  1. 質問 1 / 6

    ここでモデル化された通常のコミットを提供するスナップショットはどれですか?

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

  2. 質問 2 / 6

    C では、ステージング後の編集によって何が変わりましたか?

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

  3. 質問 3 / 6
    必須

    C で、ステージングを行わずにインデックスを再度コミットします。どの行が録音されますか?

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

  4. 質問 4 / 6
    必須

    C から開始し、編集したバージョンをステージングしてからコミットします。何が変わるのでしょうか?

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

  5. 質問 5 / 6

    D では、キャッシュされた diff は空ですが、ステータスはスペースで、次に M です。なぜですか?

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

  6. 質問 6 / 6
    必須

    A→B→Cの順に進み、インデックスの通常のコミットを行います。 D を証明する観察はどれですか?

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

6 個中 0 個が正解です

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

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

練習する

レッスン 5 の前に、紙の上で予測します。ファイルをステージングし、ステージング後に編集し、通常どおりコミットします。どの補助線が記録されており、その後の編集はどこに残っていますか?次に、シーケンスを変更します。編集したファイルをコミットする前に再度ステージングします。これで、記録された行は新しい行になり、動作上の差異は残りません。ビデオでは、両方のルートと実際の出力を示しています。レッスン 5 で両方を自分で確認します。

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

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

要約

  • 作業ファイル、インデックス、記録された履歴は別のスナップショットです。
  • ステージングは選択されたコンテンツをキャプチャします。後で編集しても、自動的には更新されません。
  • 両方の比較を調べて、ローカル コミットをリモート アクションと間違えないようにしてください。

用語集の用語の紹介

ワーキングツリー - 作業ツリーステージングエリア / インデックス — منطقة التجهيز / الفهرس;コミット — إيداع;参照 — 重要;追跡されていません — 追跡されていません。上演 — مُجهَّز。 HEAD は文字通りの技術識別子のままです。

ビデオトランスクリプト

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

トランスクリプトを表示する
  1. 分割してコミットを予測する 作業ファイル、インデックス、履歴。
  2. これは将来のプロジェクトのプレビューです。あなたの 独自のリポジトリはまだ作成されていません。
  3. 3 つのラベル付きスナップショットを使用します。 ボックス間を移動するファイルではありません。
  4. 作業ツリーには、 編集してディスクに保存したファイル。
  5. インデックスはスナップショットを説明します コミットの準備をしています。
  6. コミットはスナップショットとメタデータを記録します そしてそれ以前の歴史との関係。
  7. 最初のコミットの前に、ブランチ 名前はありますが、まだチップが記録されていません。
  8. ステージングでは現在のコンテンツが選択されます。 後でファイルを移動せずに編集できます。
  9. 私たちの未来のヒーローが始まります このサポートラインで。
  10. A では、ファイルは次の場所にのみ存在します。 作業ツリーであり、追跡されていません。
  11. デモ ファイルをステージングします。インデックス 現在はオリジナルのヒーローを保持しています。
  12. ステージング後に編集します。作業ファイル 変更されますが、インデックスは以前のままです。
  13. 再びステージングすることなく、それをサポートします 通常のコミットレコードは行でしょうか?
  14. 用意されたセリフを録音し、 後の作業編集ではありません。
  15. ショートステータスは 2 つの異なることを示します 同じパスの比較。
  16. ここで、A は段階的な加算です。 M 後から動作する修正です。
  17. 用意したファイルを読み込む インデックスから直接。
  18. インデックスにはまだ含まれています 先ほどのサポートライン。
  19. 通常の差分は動作を比較します ファイルをその準備されたバージョンに置き換えます。
  20. 最初のコミットの前に、キャッシュされた 概要では、ステージングされた新しいファイルについて説明します。
  21. 同じ状態を検査してみます 実際の GitTree の録音で。
  22. 作業変更を表示するを開く コマンドパレットから。
  23. ステージングされていない行には新しい行が表示されます インデックスに対して作業中の編集。
  24. 段階的な行には以前の行が表示されます 最初のコミット用に準備されたファイル。
  25. 1 つのパスが両方のリストに表示される場合があります 2 つの物理ファイルを作成する必要はありません。
  26. どちらの比較を読んでも、 コンテンツをステージング、ステージング解除、または破棄します。
  27. 通常のコミットではインデックスが記録されます そして地方支部を前進させます。
  28. 録音された被験者が確認します 最初のヒーローコミットが存在します。
  29. 先頭のスペースは重要です。 動作比較はまだ異なります。
  30. キャッシュされた空の差分とは、 インデックスはこのパスの履歴と一致します。
  31. 作業差分にはまだ次の内容が含まれています 新しい編集。何も失われませんでした。
  32. 履歴にはコミットが含まれていますが、 意図的な作業編集が残っています。
  33. シーケンスを変更する: ステージング コミットする前にファイルを編集してください。
  34. 新しい行が記録され、 このパスには残りの差分はありません。
  35. これらのローカル手順はいずれもありません プロバイダーに何でもアップロードします。
  36. あなた自身のレッスンはまだ終わっていません リポジトリ;次に初期化が行われます。
  37. ファイルを破棄したり履歴をリセットしたりしないでください 例を一致させるためだけに。
  38. 作業ファイル、準備されたコンテンツ 記録された履歴は異なる場合があります。
  39. 両方のシーケンスを確認し、 2 つのステータス列について説明します。
  40. 次に、GitTree フィーチャーを内部に作成します GitTree さんは、このモデルを自分でテストしてください。