agent/reader-ui
只负责 reader 页面;独立 worktree;独立端口。
输出:原子 commits + 测试证据分布式版本控制 · 深度学习档案
概念、类比边界、恢复策略、协作流程与 AI 时代最佳实践
Git 是一套用不可变快照保存项目状态、用提交关系图表达因果、用可移动指针管理路线、用显式整合处理分歧的分布式版本控制系统。
它不是自动备份,不是 GitHub,也不只是“撤销按钮”。它真正降低的是试错、并行、审查和恢复的成本。
核心录音给出的直觉是:Git 是“平行世界的时光机”。这个类比很有力量,因为它让分支实验、选择路线和回到历史节点变得可感知;但它还不够精确。完整模型需要再补三块:
| Git 概念 | 类比映射 | 准确之处 | 不准确之处 / 失效边界 |
|---|---|---|---|
| repository | 整座档案馆 | 保存对象、引用与历史关系 | Git 仓库不是给人直接翻阅的普通文件柜;底层是内容寻址对象库与引用 |
| working tree | 馆外工作桌 | 你正在编辑、可能凌乱、尚未归档的现场 | 工作桌上的内容并不自动安全;未提交内容可能丢失 |
| index / staging | 待入库清单 | 精确决定下一只档案袋装什么 | 它不是简单“缓存”;同一文件可以只暂存部分 hunk |
| commit | 有编号的档案袋 / 存档点 | 固化一次有意图的项目状态,并连接父提交 | commit 不是手动复制整套文件;未变化内容通过对象复用避免重复 |
| log | 档案目录 | 能沿父关系追溯历史 | 日志展示顺序不等于唯一真实因果;历史是 DAG,不总是一条线 |
| restore / revert | 取回旧档 / 新增纠错档 | 能恢复旧内容或记录反向变更 | 不是所有未提交内容都可恢复;revert 也可能冲突 |
最有用的直觉:commit 不是“保存一下”,而是“让项目历史多出一个可解释、可定位、可审查的节点”。
类比边界:真实时光机暗示“过去被改变后现在自动跟着改变”;Git 的 commit 通常不可变。所谓改写历史,实际上是生成新 commit 并移动引用,旧对象在一段时间内可能仍可由 reflog 找到。[G2][G9]
| Git 概念 | 类比映射 | 准确之处 | 不准确之处 / 失效边界 |
|---|---|---|---|
| branch | 一条平行剧情路线 | 从共同起点产生不同后续,便于独立试验 | branch 本身不是独立目录,也不是复制出的完整宇宙;它是 ref |
| merge | 两条剧情线汇合 | 保留或整合两边有效变化 | 不是机械“选一个”;可能要逐处裁决,且文本无冲突仍可能语义错误 |
| rebase | 把剧情搬到新起点重演 | 让一组提交基于新的祖先重新生成 | 会产生新 commit ID;共享后使用会让协作者的历史基础失配 |
| worktree | 给每条路线一间独立工作室 | 多个分支可同时出现在不同目录里,减少工作区相互覆盖 | 多个房间仍共享同一仓库管理数据;同一分支通常不能同时检出到多个 worktree |
| PR | 把候选剧情送进编辑会 | 聚合 diff、讨论、检查和合并决定 | PR 属于托管平台协作层,不是 Git 核心对象 |
核心录音的小说案例非常适合这个类比:先提交“16 年前发生凶案、16 年后发现尸体”的共同世界,再用多个 branch 尝试不同主角,最后选择、组合或放弃路线。[N1]
类比边界:删除 branch 只是删掉路标,不保证相关 commit 立刻从对象库消失;同样,保留 branch 也不等于成果已经验证正确。
这组类比最适合解释 remote、fetch、push 和引用。
| Git 概念 | 类比映射 | 准确之处 | 不准确之处 / 失效边界 |
|---|---|---|---|
| object | 有内容指纹的标准货箱 | 相同内容可复用;内容决定身份 | Git 对象不是业务文件本身的简单压缩包 |
| commit graph | 带前序关系的运输网络 | 能表达从哪里来、在哪分叉、在哪里汇合 | 不是按时间排队的单线铁路;时间戳也可能不可靠 |
| branch / tag | 路标 / 固定里程碑 | 给难记的 commit ID 提供名字 | tag 通常不自动移动;branch 会随提交前移 |
| remote | 另一座仓库站点的地址别名 | 可以交换对象和引用 | remote 不是天然“权威中心”;权威来自团队约定和权限策略 |
| fetch | 把对方最新货物清单运到本地观察区 | 获取对象并更新 remote-tracking refs,不自动改当前工作 | 本地看到的是最近一次 fetch 的视图,不是实时直播 |
| push | 请求远端移动它的路标 | 发布对象并更新允许移动的远端引用 | 远端可以拒绝;push 不是“本地保存” |
类比边界:网络同步不是把目录做字节级镜像;Git 交换的是对象和引用,并受可达性、权限、fast-forward 与服务端规则约束。[G7][G8]
一个 commit 至少表达三件事:
首个 commit 没有父;普通 commit 通常一个父;merge commit 通常两个或更多父。commit ID 因内容与父关系而定,所以 rebase 即便得到相同文件结果,也会生成身份不同的新 commit。[G2][G5]
M 是合流节点。“历史”保留了 B 处分叉、两条路线分别推进、再于 M 汇合的因果结构。
origin/main;不是远端实时状态。磁盘上能看见、能编辑的文件。可以包含未跟踪和未暂存变化。
edit · status · diff下一次 commit 准备记录的准确内容。是语义拆分层,不只是中转站。
add · restore --staged当前检出路线的历史节点;commit 后 branch 通常移动到新节点。
commit · show · log理解三棵树,才能区分三种 diff:
| 想看什么 | 比较关系 | 常用观察 |
|---|---|---|
| 尚未暂存的变化 | working tree ↔︎ index | git diff |
| 已暂存、即将提交的变化 | index ↔︎ HEAD | git diff --staged |
| 当前所有已跟踪变化 | working tree ↔︎ HEAD | git diff HEAD |
最关键的因果:git add
不是“把文件标记一下”,而是把当下内容写入
index。之后继续编辑同一文件,working tree 与 index 会再次不同。[G1]
.gitignore 自动停止跟踪。[G11]| 概念 | 它改变什么 | 正确心智模型 | 典型陷阱 |
|---|---|---|---|
init |
创建仓库元数据 | 让现有目录开始拥有 Git 对象与引用空间 | 不要在未知目录或用户根目录盲目 init |
clone |
创建本地仓库、工作区与 remote 配置 | 拿到可工作的历史副本,而非下载 ZIP | 克隆通常不是备份策略的全部 |
| bare repository | 只有仓库数据,无普通工作区 | 常用于服务端或集中交换 | 不适合直接编辑项目文件 |
| 概念 | 回答的问题 | 最佳实践 |
|---|---|---|
status |
现在站在哪条分支?哪些文件在哪一层变化? | 高风险操作前后都看;机器集成可用 porcelain 格式 |
diff |
两个状态之间具体差什么? | 提交前读 unstaged + staged diff;大改用 --stat
先看边界 |
show |
某个对象/commit 包含什么? | 核验单个交付节点,而不是只信 commit message |
log |
历史关系和说明是什么? | 图形化查看分叉;按文件、作者、路径、范围缩小 |
blame |
每行最后由哪个 commit 改动? | 用于寻找上下文,不用于“甩锅”;结合 commit 说明和 PR 阅读 |
bisect |
哪个 commit 首次引入回归? | 准备可靠的 good/bad 判据;可接自动测试,复杂度近似对数级 |
| 概念 | 本质 | 最佳实践 |
|---|---|---|
add |
更新 index | 按意图选择文件或 hunk;不要默认全塞 |
commit |
从 index 建快照并连接父历史 | 一个 commit 一个可解释、可验证、可独立回滚的语义变化 |
| amend | 用新 commit 替换分支尖端 | 只整理尚未共享的最近提交;共享后慎用 |
| commit message | 给未来读者的因果说明 | 标题写做了什么,正文解释为什么、约束和副作用;不要只写
update |
| trailer | 结构化提交元数据 | 可记录任务、协作者、签署或审查信息;先与团队约定字段 |
原子提交不是“越小越好”。它的尺度应满足:只有一个意图、节点可构建/验证、撤销时不会带走无关变化、审查者能形成完整判断。[N3]
| 概念 | 本质 | 什么时候用 |
|---|---|---|
| branch | 可移动 ref | 为任务、假设、修复或发布线命名 |
| switch | 切换 branch 或创建后切换 | 日常分支切换,语义比旧式 checkout 更聚焦 |
| detached HEAD | HEAD 直接指向 commit | 查看历史、临时实验;要保留新提交需及时创建 branch |
| tag | 稳定里程碑引用 | 标记版本、交付点;发布场景优先 annotated/signed tag 取决于策略 |
| branch protection | 托管平台规则 | 限制直接推送、要求审查和 checks;不是 Git 核心能力 |
| 概念 | 本质 | 适用 / 不适用 |
|---|---|---|
| worktree | 同一仓库挂接多个工作目录 | 并行任务、长测试、多个 Agent;避免一个目录频繁切换 |
| sparse checkout | 工作区只呈现路径子集 | 大型单仓库减少检出范围;不是删除其他历史 |
| 概念 | 事实 | 容易混淆的边界 |
|---|---|---|
| remote | 另一仓库位置的别名 | origin 只是默认名字,不天然是权威 |
| fetch | 取对象并更新 remote-tracking refs | 不整合当前 branch,适合先观察 |
| pull | fetch 后再 merge 或 rebase | 会改变当前历史/工作状态,不只是下载 |
| push | 发送对象并请求更新远端 ref | 可能被 non-fast-forward、权限或保护规则拒绝 |
| upstream branch | 当前 branch 默认比较/拉取/推送目标 | “upstream 仓库”与“上游分支配置”是相关但不同语境 |
| refspec | 定义本地与远端引用怎样映射 | 高级能力;不理解时不要让自动化随意改 |
| 目标 | 首选候选 | 历史结果 | 主要风险 |
|---|---|---|---|
| 保留真实分叉与合流 | merge | 可能产生双父 merge commit | 历史更复杂;冲突仍需裁决 |
| 让未共享功能分支基于新主线重放 | rebase | 生成一串新 commit,线性化 | 改变 ID;共享历史会让协作者分叉 |
| 主线只保留一个功能级节点 | squash merge | 多个分支提交压成一个主线 commit | 丢失分支内部细粒度因果 |
| 只搬运一个明确修复 | cherry-pick | 在当前位置生成等价变更的新 commit | 重复变更可能给后续 merge 制造困惑 |
| 目标分支只是落后、没有分叉 | fast-forward | 只前移 ref,不产生 merge commit | 容易让人误以为“merge 什么都没做” |
Git 通常先找共同祖先(merge base),再比较两条路线相对祖先的变化。没有重叠歧义时可自动组合;有歧义时把冲突交给人。真正的 merge commit 同时指向两个父节点,因此保留“这两条历史在这里会面”的事实。[G4]
准确类比:两位编辑分别在同一旧稿上修订,最终拿旧稿、甲版、乙版三份材料对照整合。
边界:没有冲突只说明 Git 在文本/路径层面找到可组合结果,不代表接口语义、数据库迁移顺序、权限逻辑或 UI 行为正确。[N3]
Rebase 会找出当前路线独有的提交,把这些变化在新基线之上依次重放,生成新 commit。文件最终内容可能与 merge 相似,但历史身份和叙事不同。[G5]
建议:
--force-with-lease
的保护语义,但它仍是高风险动作,先确认远端没有未知新提交。Squash 适合把大量 WIP/修正提交整理为一个主线语义单元。它改善主线可读性,但会丢掉分支内部可独立定位/回滚的细节。不要把“整洁”绝对化:调试与审计同样需要有意义的中间节点。
适合把已知修复搬到 release branch,或从实验中选取一个独立成果。它创建新 commit,不能把两个相似 ID 当成同一个历史节点。频繁 cherry-pick 往往暗示分支策略或发布线管理需要重看。
先 status / diff / log / reflog,不改变状态。
restore 前先确认内容是否还有价值;未提交内容可能不可恢复。
把内容从 index 移出,通常保留 working tree 修改。
优先新增 revert,保持审计和协作者基础稳定。
| 工具 | 核心作用 | 会不会新增 commit | 会不会移动 branch | 共享历史建议 |
|---|---|---|---|---|
| restore | 从某状态恢复 working tree / index 内容 | 否 | 否 | 适合文件级恢复,但会覆盖目标位置内容 |
| reset | 移动当前 branch,并按模式更新 index/working tree | 否 | 是 | 主要用于尚未共享历史;hard 模式高风险 |
| revert | 计算指定 commit 的反向变化并提交 | 是 | 正常前进 | 共享历史的默认安全选择 |
不要把 `reset --hard`、`clean -fd`、无保护 force push 当成“卡住时的万能修复”。它们可能让 Git 没有机会替你恢复未提交、未跟踪或远端新增内容。
常见恢复思路:先停手 → 看 status → 看 reflog → 找到误操作前的 commit → 创建新 branch 指向它 → 再比较。不要一慌就继续 reset,连续移动指针只会增加认知负担。[G9]
clean 面向未跟踪文件,风险不在 commit
历史保护范围内;先 dry-run。在单一工作目录里切 branch,会同时切换目录内容;未提交修改、构建产物、依赖缓存、正在运行的服务和终端上下文都可能阻碍或污染切换。多个 worktree 让不同 branch 同时出现在不同目录,各自拥有工作区和 index,同时共享仓库对象库。[G3]
只负责 reader 页面;独立 worktree;独立端口。
输出:原子 commits + 测试证据只负责 library 页面;不动 reader 共享协议。
输出:原子 commits + 截图只负责 tokens/主题;变更公共接口前先协调。
输出:影响清单 + 回滚点决定顺序、读 diff、处理共享语义、运行组合测试并合并。
输出:主线上的可信节点建议:每个并发任务必须同时拥有五个边界:责任文件、branch、worktree、验证命令、完成定义。缺一项,就可能只是“并行活动”,不是“可整合的并行工作”。[N3][L6]
获取远端对象并更新本地 remote-tracking refs,不自动把它整合进当前 branch。适合“先看看大家发生了什么,再决定怎么接”。[G7]
通常等价于先 fetch,再按配置或参数 merge/rebase。它会改变当前历史,因此在脏工作区或不清楚团队策略时,盲目 pull 容易把两个问题混在一起。[G8]
它不是保存动作,而是协作动作。non-fast-forward 拒绝意味着远端 ref 已含你本地没有纳入的历史,系统在阻止静默覆盖。[G8]
| 平台概念 | 核心作用 | 与 Git 的关系 | 常见误区 |
|---|---|---|---|
| Pull Request | 提议把一组变化整合到目标分支 | 围绕 commits、diff 和目标 ref 建协作上下文 | 不是 git pull |
| Issue | 记录问题、任务、讨论或提案 | 可与 branch/commit/PR 关联,但不是 Git 对象 | Issue 关闭不等于代码已经验证发布 |
| Fork | 托管平台上的关联仓库副本 | 常用于无直接写权限时贡献 | 不是 branch;拥有独立远端仓库关系 |
| Release | 面向使用者的版本交付页面/资产 | 常基于 tag,并附二进制、说明与链接 | tag 不自动等于经过验证的 release |
Git 的 rerere 能记录并复用曾经的冲突解决方式,适合重复 rebase/merge 的团队;但自动复用的结果仍需验证,尤其当语义背景已改变。
任何一层缺失,历史解释力都会下降。只看 log --oneline
很快,但可能把复杂因果压扁成标题列表。
给定一个已知 good 节点和一个已知 bad 节点,Git 选择中间候选让你测试,从而不断缩小引入回归的范围。它的力量依赖两个前提:
巨型 commit 即使被 bisect 命中,内部仍然难定位,这正是 atomic commit 的工程价值。[N3]
行级最后修改者只是调查入口;真正原因可能在更早重构、自动格式化、代码生成或需求变化里。正确用法是从行追到 commit,再追到 diff、message、PR 和测试。
常见层级包括 system、global、local/worktree 等;后者覆盖前者。重要的不是背路径,而是每次知道“这个配置影响谁、在哪里定义、能否被仓库携带”。
.gitignore,个人本地排除可用仓库 exclude
或全局 excludesfile,按场景选择。[G11]hooks 能在 commit、merge、push 等事件前后运行检查或自动化。客户端 hook 默认不会随 clone 自动启用,因此关键治理不能只依赖个人本地 hook;服务端保护、CI 和可重复脚本更可靠。[G10]
Git 擅长文本和可差异审查的内容;视频、模型权重、大型设计源文件会放大 clone、存储和历史成本。LFS 用小指针替代普通 Git 对象中的大文件内容,但仍需服务端、配额、备份与迁移策略。
Git 能通过多个 clone 提供分布式冗余,但它不天然覆盖未提交工作、外部数据库、LFS 对象、Issue/PR 讨论、CI secrets、Release 附件或托管平台元数据。重要项目仍需独立备份和恢复演练。
<type>: <一句话说明语义变化>
为什么:原问题、约束或决策背景
怎么验证:测试、构建、截图或最小探针
限制:未覆盖范围、兼容性或后续工作
不要机械追求 Conventional Commits;它只是可选协议。真正目标是让节点的意图、范围和验证可恢复。
| 诱人的错误相信 | 为什么会信 | 更准确的模型 | 纠正提示 |
|---|---|---|---|
| commit = 保存 | GUI 常把 stage + commit 合成按钮 | commit 从 index 创建历史节点 | 先问:下一张快照到底包含什么? |
| Git 记录每次修改 | “时光机”类比太强 | Git 只记录提交过的状态 | 未提交内容不自动安全 |
| Git 每次只存 diff | GitHub 主要展示差异 | 逻辑模型是快照;diff 是状态比较视图 | 把 snapshot 和存储优化分开 |
| branch = 项目副本 | 切换后文件真的变了 | branch 是 ref;工作树呈现被引用快照 | 路线不是房间 |
| worktree 消灭冲突 | 工作目录独立了 | 只减少现场覆盖;整合仍可能冲突 | 隔离执行 ≠ 自动集成 |
| pull = 下载 | 名字像“拉取文件” | fetch + 整合 | 想只观察就先 fetch |
| PR = pull | 英文相近 | PR 是平台上的合并提议 | 命令与协作页面分开 |
| merge 成功 = 正确 | Git 没报红 | 只说明算法得到文本结果 | 组合测试 + 人工语义审查 |
| rebase 只是美化 | 文件结果看起来相同 | 它生成新 commits、改变身份与因果 | 共享历史先问谁依赖它 |
| reset = 撤销 | 名字像恢复出厂 | 它移动 ref,并可能更新 index/工作区 | 先判断要撤销哪一层 |
.gitignore 能防泄密 |
文件不会出现在 status | 已跟踪内容仍在历史,规则也可能漏 | secret scan + 权限 + 轮换 |
| 测试绿 = 可发布 | 自动检查给出强心理信号 | 测试只覆盖写下的假设 | 补关键路径、边界与人工验收 |
建议:从同一基线开两个 branch;需要同时运行就用两个 worktree。分别定义截图、交互和验收标准,最后比较证据,而不是让两个 Agent 在同一目录互改。
先做:status / diff --stat / 按目录看 diff。确认是否混入格式化、锁文件、生成物、调试代码和不相关重构。必要时重新拆任务,不要用一个巨型 commit 把混乱合法化。[N3]
建议:先建临时恢复 branch;再用交互式 rebase、reset mixed 或分段暂存整理成语义 commits;每个节点重新验证。
默认:新增 revert,使团队看到错误与修复;除非团队明确协调历史重写,否则不要用 force push 擦除共享事实。[G7]
先拆问题:先 fetch,观察本地 branch 与
origin/... 的分歧;再选择 merge 或
rebase。不要让“下载”和“整合”同时发生后才开始理解。
先停手:看 reflog,找到原尖端,创建恢复 branch。不要继续做清理和 GC。[G9]
文本非常适合 Git;图片、附件和多设备自动同步需要额外策略。先 pull/fetch 再编辑、明确冲突处理,重要改动手动 commit/push。整体回退优先考虑新增 revert;文件级恢复可用 restore,但执行前确认未提交内容。[N5]
git statusgit diffgit diff --stagedgit log --graph --oneline --decorate --allgit refloggit add <path>git add -pgit commitgit show <commit>git switch -c <branch>git worktree add <path> -b <branch>git branch --show-currentgit fetch --prunegit log HEAD..origin/maingit diff HEAD...origin/maingit push -u origin <branch>这不是让你背命令。你只需在 AI 执行前能回答:
status、三种
diff、show、log --graph;请在下一轮用自己的话回答四件事:
届时使用 canonical prompt 8 做事实准确性、因果完整性、边界意识和遗漏概念校验。
03-Git版本控制-来源-Claude-Code.html03-Git版本控制-来源-Codex-CLI.html03-Git版本控制-来源-Gemini-3.1-Pro.html03-Git版本控制-来源-Gemini-3.6-Flash.html20260814-Git-TDD-AI系统化试错指南.htmlParallel Work Needs Separate Rooms / x-article-copy.htmlGitHub学习作战地图.html