分支、差异与评审
智能体协助为可选,须遵循书面计划;学习者拥有权限并验证每一处差异与命令结果。若所选智能体不可用,协助部分记为 blocked/unexecuted——绝不模拟。
先决条件
第 13 天的项目产物和基本的 Git status/log/diff。
学习目标
创建一个一次性克隆,对文本项目做一处聚焦的分支修改,并在提交前评审差异。
操作说明
必做:按参考答案的步骤构建私有基础仓库与克隆(只把 projects/text_tools/{__init__.py,core.py,cli.py} 复制进新的私有基础仓库——绝不可克隆、发布或改动学习仓库及其 .git、数据库、.venv 或密钥),然后创建分支 parser-help,完成指定的 --input 帮助单行改进,并在一个聚焦提交之前记录 branch、status、log、staged 与 unstaged 差异以及 git diff --check。用公开的 --help 检查证明行为——差异加退出码 0 是证据而非证明。每个块都在带 set -e 的 ( ... ) 内运行:先验证新建的 WORKDIR 再使用,mkdir/cp/cd 失败即在子 shell 内中止——失败的命令绝不会“漏过去”在你当前的仓库里运行 Git,export 也不会泄漏到调用者shell。d14env 用 env -i 包裹外部命令,丢弃环境中的 GIT_DIR/GIT_WORK_TREE/index/object/alternates、GIT_CONFIG*、XDG、模板/钩子/签名变量,使它们无法操纵“这些作例命令”;但仅靠 env -i 并不能阻止命令写到 WORKDIR 之外——让作例命令留在 WORKDIR 内的是已验证的前提条件与 fail-stop。PATH 只决定运行哪些可执行文件(会打印解析后的路径;Python 固定为绝对路径 PYTHON_BIN)——它不是可信工具清单,也不是文件系统边界。这是环境卫生而非 OS 沙箱。打印出的 WORKDIR 值由你自己 export——后续活动块要求它。选做:可按书面计划让真实智能体评审差异;若所选工具不可用,将该部分记为 blocked/unexecuted,绝不伪造会话记录。
练习与预测
预测 --input 帮助改进会改变 projects/text_tools/cli.py 的哪一行,以及复制的三个文件中哪些必须保持字节一致(用 sha256sum 验证)。解释为什么 git diff 加零退出码是证据而不是行为的证明,以及当 GIT_DIR 可能指向别的仓库时为何必须经 d14env(env -i + 私有 HOME/XDG/config/template + 关闭签名)执行,以及为何 ( set -e 的 fail-stop 与 WORKDIR 验证能防止失败的 cd 在调用者仓库中运行 Git。执行以下完整的私有环境与检查:
(
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 元数据(已验证)。请改为克隆私有基础仓库。环境中的 GIT_DIR/GIT_WORK_TREE/GIT_CONFIG*/XDG 变量会把 git 引向别的仓库或配置——env -i 丢弃它们,但并不做文件系统沙箱。绝不对学习仓库运行 reset --hard、clean、force-push 或恢复类命令。
已验证的观测结果(Linux, bash, git 2.56;你的哈希/时间戳会不同):
- sha256sum 输出三个哈希——基础仓库的身份;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 指向一个无关私有仓库并设置陷阱全局配置(他人 user.name、恶意模板钩子),本块仍只配置了私有 base/clone——无关仓库的 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.