ブランチ、差分、レビュー
エージェント支援は任意で、書面の計画に従う。学習者が権限を所有し、すべての差分とコマンド結果を検証する。選択したエージェントが使えない場合、その部分は blocked/unexecuted として記録する — シミュレートしない。
前提条件
Day 13 のプロジェクトアーティファクトと基本的な Git の status/log/diff。
学習目標
使い捨てのクローンを作成し、テキストプロジェクトに対して焦点を絞ったブランチ変更を行い、コミット前に差分をレビューする。
手順
必須作業: 参考解答の手順どおりに private ベースとクローンを構築する(projects/text_tools/{__init__.py,core.py,cli.py} のみを新しい private ベースにコピーする — 学習リポジトリやその .git、データベース、.venv、シークレットをクローン・公開・変更しない)。次にブランチ parser-help を作り、指定された --input ヘルプの 1 行改善を行い、1 つの焦点の絞られたコミットの前に branch、status、log、staged と unstaged の差分、git diff --check を記録する。公開 --help チェックで動作を証明する — 差分と終了コード 0 は証拠であり証明ではない。各ブロックは set -e を効かせた ( ... ) 内で実行する:新しい WORKDIR を使用前に検証し、mkdir/cp/cd が失敗すればサブシェル内で中断する — 失敗したコマンドが抜け落ちて現在のリポジトリで Git を実行することはなく、export も呼び出し元シェルに残らない。d14env は外部コマンドを env -i で包み、環境の GIT_DIR/GIT_WORK_TREE/index/object/alternates、GIT_CONFIG*、XDG、テンプレート・フック・署名変数を落として、それらが「この作例コマンド」を誘導できないようにする。ただし env -i だけでは WORKDIR 外への書き込みは止められない — 検証済みの前提条件と fail-stop が作例コマンドを WORKDIR 内に留める。PATH は実行ファイルの選択のみ(解決されたパスは表示される。Python は絶対パス PYTHON_BIN に固定)— 信頼ツール一覧でもファイルシステム境界でもない。これは環境の衛生であり OS サンドボックスではない。表示された WORKDIR の値を自分で export する — 後のアクティビティブロックがそれを要求する。任意作業: 書面の計画に沿って実際のエージェントに差分をレビューさせてよい。選択したツールが使えない場合は、その部分を blocked/unexecuted と記録し、トランスクリプトを捏造しない。
演習と予測
--input ヘルプ改善で projects/text_tools/cli.py のどの行が変わり、コピーした 3 ファイルのうちどれがバイト一致のままであるべきか(sha256sum で検証)を予測する。git diff と終了コード 0 が動作の証明ではなく証拠である理由、および GIT_DIR が別リポジトリを指し得るとき d14env(env -i + private HOME/XDG/config/template + 署名無効)経由の実行が重要な理由、および ( set -e の fail-stop と WORKDIR 検証が、失敗した cd が呼び出し元リポジトリで Git を実行するのを防ぐ理由を説明する。以下の完全な private セットアップとチェックを実行する:
(
set -e
WORKDIR=$(mktemp -d)
[ -n "$WORKDIR" ] && [ -d "$WORKDIR" ] && [ -w "$WORKDIR" ] && [ -x "$WORKDIR" ] || {
echo "abort: WORKDIR '$WORKDIR' is missing or unusable - refusing to run anything outside it" >&2
exit 1
}
LEARN=/absolute/path/to/your/clone
[ -f "$LEARN/projects/text_tools/cli.py" ] || {
echo "abort: LEARN must point at a checkout containing projects/text_tools/cli.py" >&2
exit 1
}
export WORKDIR LEARN
mkdir -p "$WORKDIR/home" "$WORKDIR/xdg" "$WORKDIR/tpl" "$WORKDIR/tmp"
d14env() {
env -i PATH="$PATH" HOME="$WORKDIR/home" XDG_CONFIG_HOME="$WORKDIR/xdg" \
TMPDIR="$WORKDIR/tmp" WORKDIR="$WORKDIR" LEARN="$LEARN" \
GIT_CONFIG_NOSYSTEM=1 GIT_CONFIG_GLOBAL=/dev/null \
GIT_TEMPLATE_DIR="$WORKDIR/tpl" \
GIT_CONFIG_COUNT=1 GIT_CONFIG_KEY_0=commit.gpgsign GIT_CONFIG_VALUE_0=false \
LC_ALL=C PYTHONDONTWRITEBYTECODE=1 "$@"
}
command -v git sed python3
PYTHON_BIN="$(command -v python3)"
mkdir -p "$WORKDIR/base/projects/text_tools"
cp "$LEARN"/projects/text_tools/__init__.py "$LEARN"/projects/text_tools/core.py "$LEARN"/projects/text_tools/cli.py "$WORKDIR/base/projects/text_tools/"
cd "$WORKDIR/base"
d14env git init
d14env git config user.name "Learner"
d14env git config user.email "[email protected]"
d14env sha256sum projects/text_tools/*.py
d14env git add projects/
d14env git commit -m "text_tools snapshot"
d14env git clone "$WORKDIR/base" "$WORKDIR/clone"
cd "$WORKDIR/clone"
d14env git config user.name "Learner"
d14env git config user.email "[email protected]"
d14env git switch -c parser-help
d14env sed -i 's|corpus file\.|corpus file (UTF-8 by default; override with --encoding/--errors).|' projects/text_tools/cli.py
d14env git status --short
d14env git diff
d14env git diff --cached
d14env git diff --check
d14env git add projects/text_tools/cli.py
d14env git commit -m "cli: document --input decoding defaults"
d14env git log --oneline -3
d14env "$PYTHON_BIN" projects/text_tools/cli.py --help | grep -F "UTF-8 by default"
printf 'export WORKDIR=%s # run this before the later activity blocks\n' "$WORKDIR"
)
git worktree は独立したクローンではない:ベースリポジトリの参照を共有し .git/worktrees メタデータを書き込む(検証済み)。代わりに private ベースをクローンする。環境の GIT_DIR/GIT_WORK_TREE/GIT_CONFIG*/XDG 変数は git を別のリポジトリや設定に向け得る — env -i はそれらを落とすが、ファイルシステムをサンドボックス化はしない。学習リポジトリに対して reset --hard、clean、force-push、回復系コマンドを絶対に実行しない。
検証済みの観測結果(Linux, bash, git 2.56。ハッシュ・タイムスタンプは異なる):
- sha256sum が 3 つのハッシュを出力 — ベースの同一性。core.py と __init__.py は終始バイト一致のまま。
- git status --short は M projects/text_tools/cli.py のみ。git diff は --input ヘルプ行のみ。git diff --cached は git add まで空。
- git log --oneline は text_tools snapshot の上に焦点コミットを示す。
- 動作チェック:--help が Path to the input text corpus file (UTF-8 by default; ... を出力 — 変更が有効である公開の証拠。差分だけではテキストが動いたことしか示せない。
境界: git worktree はベースの参照を共有し .git/worktrees を変更する — 独立クローンではない。環境 Git 変数の敵対性を実証済み:GIT_DIR/GIT_WORK_TREE を無関係な private リポジトリに向け、罠のグローバル設定(他人の user.name、悪意あるテンプレートフック)を与えても、このブロックは private ベース/クローンだけを設定した — 無関係リポジトリの HEAD と user.name は不変、センチネルフックは未実行、コミットは罠の身分ではなく Learner を示す。env -i は列挙された変数のみを残し、PATH はツール検索のみでリポジトリへのアクセスを与えない — 衛生でありファイルシステムのサンドボックスではない。cli.py 実行後に __pycache__/ が現れ得るが追跡対象外のビルド出力(PYTHONDONTWRITEBYTECODE=1 で防止)。Linux/bash スコープ。sed -i は GNU 形式 — macOS は sed -i ''、Windows は別コマンド(参考のみ・未実行)。
Learning Project Submission & Evidence
学習者はコマンド出力を添えてブランチ・コミット・差分・レビューの境界を説明でき、新しいヘルプテキストを示す公開 --help チェックを含み、任意のエージェントレビューが実行されたか、blocked/unexecuted として正直に記録されたかを述べる。
ソースリソースと出所
Pro Git, Second Edition
該当セクション・タイムスタンプ: Chapter 3 (Git Branching: branches, basic merging and conflicts), Chapter 7.7 (Reset Demystified), Chapter 5.2 (Contributing to a Project)
検証バージョンと日付: Second edition (Apress, 2014); verified 2026-10-30
Freely licensed reference for branching, merging, conflict resolution, and safe recovery vocabulary.
Basic git status/log/diff vocabulary from earlier study days
git help <command> and the Git manual pages ship with Git and cover the same commands offline; every required workflow is stated locally in the lesson.
比較対象候補リソースと選定評価 (2)
Interactive but requires a GitHub account and an external service; disposable local repositories keep the exercise self-contained.
Vendor-owned prose with no permissive license; Pro Git covers the same ground under CC BY-NC-SA.