[{"data":1,"prerenderedAt":1987},["ShallowReactive",2],{"navigation":3,"\u002Fcore-features\u002Fgit-workflow":189,"\u002Fcore-features\u002Fgit-workflow-surround":1982},[4,35,57,75,101,123,149,171],{"title":5,"icon":6,"path":7,"stem":8,"children":9,"page":34},"第 1 章：认识 Claude Code","i-lucide-rocket","\u002Fintro","1.intro",[10,14,18,22,26,30],{"title":11,"path":12,"stem":13},"什么是 Claude Code","\u002Fintro\u002Fwhat-is-claude-code","1.intro\u002F1.what-is-claude-code",{"title":15,"path":16,"stem":17},"Claude Code 与 Copilot、Cursor、Windsurf 的本质区别","\u002Fintro\u002Fvs-competitors","1.intro\u002F2.vs-competitors",{"title":19,"path":20,"stem":21},"AI 编程助手生态全景与选型指南","\u002Fintro\u002Fecosystem-guide","1.intro\u002F3.ecosystem-guide",{"title":23,"path":24,"stem":25},"LLM 的概率本质","\u002Fintro\u002Fllm-probability","1.intro\u002F4.llm-probability",{"title":27,"path":28,"stem":29},"从聊天机器人到 Agent","\u002Fintro\u002Ffrom-chatbot-to-agent","1.intro\u002F5.from-chatbot-to-agent",{"title":31,"path":32,"stem":33},"Claude Code 的 Agentic Loop 全拆解","\u002Fintro\u002Fagentic-loop","1.intro\u002F6.agentic-loop",false,{"title":36,"icon":37,"path":38,"stem":39,"children":40,"page":34},"第 2 章：安装与配置","i-lucide-settings","\u002Fsetup","2.setup",[41,45,49,53],{"title":42,"path":43,"stem":44},"系统要求与安装方式","\u002Fsetup\u002Fsystem-requirements","2.setup\u002F1.system-requirements",{"title":46,"path":47,"stem":48},"认证、登录与多账户管理","\u002Fsetup\u002Fauthentication","2.setup\u002F2.authentication",{"title":50,"path":51,"stem":52},"选择你的界面","\u002Fsetup\u002Fchoose-interface","2.setup\u002F3.choose-interface",{"title":54,"path":55,"stem":56},"Coding Plan","\u002Fsetup\u002Fcoding-plan","2.setup\u002F4.coding-plan",{"title":58,"icon":59,"path":60,"stem":61,"children":62,"page":34},"第 3 章：快速上手","i-lucide-hand","\u002Fquickstart","3.quickstart",[63,67,71],{"title":64,"path":65,"stem":66},"启动、交互模式与基本命令","\u002Fquickstart\u002Fstartup","3.quickstart\u002F1.startup",{"title":68,"path":69,"stem":70},"让 Claude 理解你的项目","\u002Fquickstart\u002Fcodebase-understanding","3.quickstart\u002F2.codebase-understanding",{"title":72,"path":73,"stem":74},"第一次代码变更","\u002Fquickstart\u002Ffirst-change","3.quickstart\u002F3.first-change",{"title":76,"icon":77,"path":78,"stem":79,"children":80,"page":34},"第 4 章：核心功能","i-lucide-laptop","\u002Fcore-features","4.core-features",[81,85,89,93,97],{"title":82,"path":83,"stem":84},"代码库全景扫描与模块关系分析","\u002Fcore-features\u002Fcodebase-scan","4.core-features\u002F1.codebase-scan",{"title":86,"path":87,"stem":88},"代码编辑与生成","\u002Fcore-features\u002Fedit-generate","4.core-features\u002F2.edit-generate",{"title":90,"path":91,"stem":92},"测试与调试","\u002Fcore-features\u002Ftest-debug","4.core-features\u002F3.test-debug",{"title":94,"path":95,"stem":96},"Git 工作流","\u002Fcore-features\u002Fgit-workflow","4.core-features\u002F4.git-workflow",{"title":98,"path":99,"stem":100},"工具链执行","\u002Fcore-features\u002Ftoolchain","4.core-features\u002F5.toolchain",{"title":102,"icon":103,"path":104,"stem":105,"children":106,"page":34},"第 5 章：进阶配置","i-lucide-wrench","\u002Fadvanced","5.advanced",[107,111,115,119],{"title":108,"path":109,"stem":110},"CLAUDE.md","\u002Fadvanced\u002Fclaude-md","5.advanced\u002F1.claude-md",{"title":112,"path":113,"stem":114},"Skills","\u002Fadvanced\u002Fskills","5.advanced\u002F2.skills",{"title":116,"path":117,"stem":118},"MCP","\u002Fadvanced\u002Fmcp","5.advanced\u002F3.mcp",{"title":120,"path":121,"stem":122},"Hooks 与 Plan 模式","\u002Fadvanced\u002Fhooks-plan","5.advanced\u002F4.hooks-plan",{"title":124,"icon":125,"path":126,"stem":127,"children":128,"page":34},"第 6 章：实战开发","i-lucide-hammer","\u002Fpractice","6.practice",[129,133,137,141,145],{"title":130,"path":131,"stem":132},"需求分析与架构设计","\u002Fpractice\u002Frequirements-architecture","6.practice\u002F1.requirements-architecture",{"title":134,"path":135,"stem":136},"项目脚手架搭建与技术选型","\u002Fpractice\u002Fscaffolding","6.practice\u002F2.scaffolding",{"title":138,"path":139,"stem":140},"核心功能实现","\u002Fpractice\u002Fcore-features","6.practice\u002F3.core-features",{"title":142,"path":143,"stem":144},"测试覆盖、代码审查与质量调优","\u002Fpractice\u002Ftesting-quality","6.practice\u002F4.testing-quality",{"title":146,"path":147,"stem":148},"部署上线与成果分享","\u002Fpractice\u002Fdeployment","6.practice\u002F5.deployment",{"title":150,"icon":151,"path":152,"stem":153,"children":154,"page":34},"第 7 章：心法层","i-lucide-brain","\u002Fmindset","7.mindset",[155,159,163,167],{"title":156,"path":157,"stem":158},"提示词设计原则","\u002Fmindset\u002Fprompt-design","7.mindset\u002F1.prompt-design",{"title":160,"path":161,"stem":162},"上下文管理策略","\u002Fmindset\u002Fcontext-management","7.mindset\u002F2.context-management",{"title":164,"path":165,"stem":166},"安全与权限控制","\u002Fmindset\u002Fsecurity","7.mindset\u002F3.security",{"title":168,"path":169,"stem":170},"Boris Cherny 的 9 条实战心法与团队推广经验","\u002Fmindset\u002Fboris-cherny-tips","7.mindset\u002F4.boris-cherny-tips",{"title":172,"icon":173,"path":174,"stem":175,"children":176,"page":34},"附录","i-lucide-paperclip","\u002Fappendix","8.appendix",[177,181,185],{"title":178,"path":179,"stem":180},"常用命令速查表","\u002Fappendix\u002Fa.command-cheatsheet","8.appendix\u002Fa.command-cheatsheet",{"title":182,"path":183,"stem":184},"AI 核心术语汇编","\u002Fappendix\u002Fb.ai-terminology","8.appendix\u002Fb.ai-terminology",{"title":186,"path":187,"stem":188},"资源链接与延伸阅读","\u002Fappendix\u002Fc.resources","8.appendix\u002Fc.resources",{"id":190,"title":94,"body":191,"description":197,"extension":1976,"links":1977,"meta":1978,"navigation":460,"path":95,"seo":1980,"stem":96,"__hash__":1981},"docs\u002F4.core-features\u002F4.git-workflow.md",{"type":192,"value":193,"toc":1921},"minimark",[194,198,203,211,216,219,311,318,328,332,343,349,352,356,359,365,376,380,383,387,390,412,416,422,425,429,435,504,507,511,514,520,524,527,533,544,590,601,605,608,612,618,624,668,672,675,681,685,688,694,698,701,705,711,714,752,756,761,767,772,784,788,791,795,798,804,808,814,819,825,829,835,839,846,850,853,859,866,949,953,956,962,979,983,986,992,1003,1044,1048,1052,1055,1061,1064,1068,1074,1078,1081,1087,1090,1094,1100,1106,1110,1113,1119,1123,1126,1130,1133,1144,1147,1151,1162,1201,1208,1213,1268,1271,1275,1278,1394,1399,1405,1409,1481,1485,1488,1499,1503,1555,1562,1566,1569,1575,1579,1583,1589,1708,1714,1718,1794,1798,1847,1850,1917],[195,196,197],"p",{},"版本控制是软件开发的基石，而 Git 则是这一领域的事实标准。然而，日常的 Git 操作——提交、分支管理、冲突解决、PR 创建——往往占据了开发者大量的心智带宽。Claude Code 将 Git 从一套需要记忆的命令集，转变为可以用自然语言直接操控的协作伙伴。它读取你的仓库状态、理解 diff 的语义、生成符合团队规范的提交信息，并能以对话方式解决合并冲突。本章将系统介绍如何利用 Claude Code 构建高效、低摩擦的 Git 工作流。",[199,200,202],"h2",{"id":201},"_1-对话式-git-操作","1. 对话式 Git 操作",[195,204,205,206,210],{},"Claude Code 的 Git 集成并非简单地帮你生成命令供你复制粘贴，而是直接在你的终端中执行 Git 操作。当你启动 Claude Code 时，它会自动感知当前仓库的分支状态、未提交的变更和最近的提交历史，无需你手动运行 ",[207,208,209],"code",{},"git status"," 或粘贴 diff。",[212,213,215],"h3",{"id":214},"_11-查看当前变更","1.1 查看当前变更",[195,217,218],{},"最基础的 Git 工作流始于了解\"我改了什么\"。Claude Code 支持多种自然语言提问方式来获取变更概览：",[220,221,222,238],"table",{},[223,224,225],"thead",{},[226,227,228,232,235],"tr",{},[229,230,231],"th",{},"自然语言提问",[229,233,234],{},"Claude 执行的操作",[229,236,237],{},"输出内容",[239,240,241,258,271,285,298],"tbody",{},[226,242,243,247,255],{},[244,245,246],"td",{},"\"我改了哪些文件？\"",[244,248,249,251,252],{},[207,250,209],{}," + ",[207,253,254],{},"git diff --stat",[244,256,257],{},"修改文件列表及每文件的增删行数",[226,259,260,263,268],{},[244,261,262],{},"\"show me the diff for src\u002Fauth.ts\"",[244,264,265],{},[207,266,267],{},"git diff src\u002Fauth.ts",[244,269,270],{},"该文件的详细 diff",[226,272,273,276,282],{},[244,274,275],{},"\"summarize my changes\"",[244,277,278,281],{},[207,279,280],{},"git diff"," + 语义分析",[244,283,284],{},"按功能区域分组的变更摘要",[226,286,287,290,295],{},[244,288,289],{},"\"what's staged vs unstaged?\"",[244,291,292],{},[207,293,294],{},"git status --short",[244,296,297],{},"已暂存与未暂存文件的分类列表",[226,299,300,303,308],{},[244,301,302],{},"\"compare this with main\"",[244,304,305],{},[207,306,307],{},"git diff main...HEAD",[244,309,310],{},"当前分支与 main 的完整差异",[195,312,313,317],{},[314,315,316],"strong",{},"对话示例","：",[319,320,325],"pre",{"className":321,"code":323,"language":324},[322],"language-text","User: what files have I changed?\n\nClaude: 你当前修改了 7 个文件，分布在 3 个目录中：\n\n  数据库层 (2 文件):\n    - migrations\u002F20250426_add_user_prefs.sql  (+45 行)\n    - src\u002Fdb\u002Fschema.ts                         (+12, -3 行)\n\n  API 层 (3 文件):\n    - src\u002Fapi\u002Fuser.ts                          (+67, -8 行)\n    - src\u002Fapi\u002Ftypes.ts                         (+15 行)\n    - src\u002Fmiddleware\u002Fauth.ts                   (+23 行)\n\n  测试 (2 文件):\n    - tests\u002Fapi\u002Fuser.test.ts                   (+89 行)\n    - tests\u002Fmiddleware\u002Fauth.test.ts            (+34 行)\n\n其中 4 个文件已暂存，3 个未暂存。\n","text",[207,326,323],{"__ignoreMap":327},"",[212,329,331],{"id":330},"_12-用自然语言执行-git-命令","1.2 用自然语言执行 Git 命令",[195,333,334,335,338,339,342],{},"Claude Code 将 Git 命令的语义与自然语言意图进行映射。你不需要记住 ",[207,336,337],{},"git checkout -b"," 或 ",[207,340,341],{},"git rebase --onto"," 的精确语法，只需描述你想做什么：",[319,344,347],{"className":345,"code":346,"language":324},[322],"User: 创建一个功能分支来实现通知系统，基于 main 分支\n\nClaude: 已创建并切换到分支 feature\u002Fnotification-system\n       （基于 main，当前最新 commit: a3f7d2e）\n\nUser: 把这个分支变基到最新的 main 上\n\nClaude: 正在获取远程更新...\n       已将 feature\u002Fnotification-system 变基到 origin\u002Fmain 之上\n       （解决了 0 个冲突）\n\nUser: 删除所有已经合并到 main 的本地分支\n\nClaude: 发现以下 3 个分支已合并到 main，可以安全删除：\n       - fix\u002Fauth-timeout\n       - chore\u002Fupdate-deps\n       - docs\u002Fapi-guide\n       \n       确认删除吗？ (y\u002Fn)\n",[207,348,346],{"__ignoreMap":327},[195,350,351],{},"这种对话式交互的核心优势在于：Claude 不仅执行命令，还会在执行前分析潜在影响、在执行后总结结果，并在遇到问题时提供上下文解释而非原始错误信息。",[212,353,355],{"id":354},"_13-暂存与撤销","1.3 暂存与撤销",[195,357,358],{},"暂存（stage）和撤销（undo）是日常开发中最频繁的操作之一。Claude Code 支持精确到文件甚至代码块的粒度控制：",[319,360,363],{"className":361,"code":362,"language":324},[322],"User: 只暂存 src\u002Fapi\u002F 目录下的修改\n\nClaude: 已暂存 src\u002Fapi\u002F 目录下的 3 个文件。\n       剩余 2 个未暂存文件：tests\u002Fapi\u002Fuser.test.ts, README.md\n\nUser: 撤销刚才对 auth.ts 的所有修改\n\nClaude: 已重置 src\u002Fmiddleware\u002Fauth.ts 到 HEAD 状态。\n       （丢弃了 23 行新增内容）\n\nUser: 把未暂存的修改保存起来，我要切换分支\n\nClaude: 已创建 stash: \"WIP on feature\u002Fnotification-system\"\n       包含 2 个文件的未暂存修改。\n",[207,364,362],{"__ignoreMap":327},[195,366,367,368,371,372,375],{},"Claude Code 还内置了快速撤销机制：在 Claude 正在修改文件时，连续按两次 ",[207,369,370],{},"Esc"," 键（Esc+Esc）可中断当前回合。部分情况下可回滚已做出的文件修改，但并非保证性撤销——部分修改可能已在之前的 tool use 中写入。这与 ",[207,373,374],{},"git stash"," 不同——它是一个内部检查点机制，保存了代码状态和对话上下文。官方定义为 \"Rewind or summarize — Restore code and\u002For conversation to a previous point, or summarize from a selected message\"。",[199,377,379],{"id":378},"_2-生成提交信息","2. 生成提交信息",[195,381,382],{},"提交信息（commit message）是代码历史的叙事线索。一个良好的提交信息能够在六个月后帮助团队理解\"为什么\"做出某个变更。Claude Code 通过分析实际 diff 内容（而非生成通用模板）来撰写描述性提交信息。",[212,384,386],{"id":385},"_21-自动分析-diff-生成消息","2.1 自动分析 diff 生成消息",[195,388,389],{},"当你请求提交时，Claude Code 会执行以下流程：",[391,392,393,400,403,406],"ol",{},[394,395,396,397,399],"li",{},"运行 ",[207,398,280],{}," 读取所有 staged\u002Funstaged 变更",[394,401,402],{},"分析代码语义，识别变更类型（新功能、Bug 修复、重构、文档等）",[394,404,405],{},"根据项目约定生成提交信息",[394,407,408,409],{},"展示给你确认后再执行 ",[207,410,411],{},"git commit",[195,413,414,317],{},[314,415,316],{},[319,417,420],{"className":418,"code":419,"language":324},[322],"User: commit these changes\n\nClaude: 我已分析你的变更，生成以下提交信息：\n\n       feat(api): add cursor-based pagination to search endpoint\n\n       - Implement keyset pagination using created_at + id composite cursor\n       - Add database migration for composite index on (created_at, id)\n       - Update OpenAPI spec with pagination query parameters\n       - Add integration tests for edge cases (empty result, last page)\n\n       提交信息是否符合你的预期？\n       [y] 确认提交  [n] 修改信息  [s] 拆分提交  [c] 取消\n",[207,421,419],{"__ignoreMap":327},[195,423,424],{},"描述性提交信息有助于审查者快速理解变更意图，是团队代码审查的最佳实践。",[212,426,428],{"id":427},"_22-遵循团队提交规范","2.2 遵循团队提交规范",[195,430,431,432,434],{},"如果你的团队使用 Conventional Commits 或其他提交规范，只需在项目的 ",[207,433,108],{}," 中声明，Claude 会自动遵循：",[319,436,440],{"className":437,"code":438,"language":439,"meta":327,"style":327},"language-markdown shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","## 提交规范\n\n- 使用 Conventional Commits 格式：feat, fix, docs, refactor, test, chore\n- 包含作用域：feat(auth): add OAuth flow\n- 主题行不超过 72 个字符\n- 多文件变更添加正文，使用 bullet points\n- 关联 Issue 编号：Closes #123\n","markdown",[207,441,442,455,462,472,480,488,496],{"__ignoreMap":327},[443,444,447,451],"span",{"class":445,"line":446},"line",1,[443,448,450],{"class":449},"sMK4o","## ",[443,452,454],{"class":453},"sBMFI","提交规范\n",[443,456,458],{"class":445,"line":457},2,[443,459,461],{"emptyLinePlaceholder":460},true,"\n",[443,463,465,468],{"class":445,"line":464},3,[443,466,467],{"class":449},"-",[443,469,471],{"class":470},"sTEyZ"," 使用 Conventional Commits 格式：feat, fix, docs, refactor, test, chore\n",[443,473,475,477],{"class":445,"line":474},4,[443,476,467],{"class":449},[443,478,479],{"class":470}," 包含作用域：feat(auth): add OAuth flow\n",[443,481,483,485],{"class":445,"line":482},5,[443,484,467],{"class":449},[443,486,487],{"class":470}," 主题行不超过 72 个字符\n",[443,489,491,493],{"class":445,"line":490},6,[443,492,467],{"class":449},[443,494,495],{"class":470}," 多文件变更添加正文，使用 bullet points\n",[443,497,499,501],{"class":445,"line":498},7,[443,500,467],{"class":449},[443,502,503],{"class":470}," 关联 Issue 编号：Closes #123\n",[195,505,506],{},"配置后，每次提交都会自动匹配规范，无需反复提醒。",[212,508,510],{"id":509},"_23-拆分纠缠的变更","2.3 拆分纠缠的变更",[195,512,513],{},"实际开发中，工作目录常常包含多个不相关的变更——一个新功能、一个顺手修复的 Bug、一段看到就忍不住重构的代码。Claude Code 可以帮你将它们拆分为逻辑独立的提交：",[319,515,518],{"className":516,"code":517,"language":324},[322],"User: 我的工作目录里有多个不相关的修改，帮我拆分成独立的提交\n\nClaude: 我分析了你的变更，识别出 3 个逻辑组：\n\n       组 1 - Bug 修复 (2 文件):\n         src\u002Fauth\u002Fsession.ts      - 修复会话超时计算\n         tests\u002Fauth\u002Fsession.test.ts\n         → 建议提交: fix(auth): correct session timeout calculation\n\n       组 2 - 新功能 (3 文件):\n         src\u002Fapi\u002Fsearch.ts        - 添加分页参数\n         src\u002Fdb\u002Fmigrations\u002F...    - 添加索引\n         tests\u002Fapi\u002Fsearch.test.ts\n         → 建议提交: feat(api): add pagination to search endpoint\n\n       组 3 - 重构 (2 文件):\n         src\u002Futils\u002Fhelpers.ts     - 提取公共函数\n         src\u002Futils\u002Fvalidators.ts\n         → 建议提交: refactor(utils): extract shared validation logic\n\n       确认这个分组方案吗？确认后我会按组依次暂存并提交。\n",[207,519,517],{"__ignoreMap":327},[212,521,523],{"id":522},"_24-提交信息中的-co-authored-by","2.4 提交信息中的 Co-Authored-By",[195,525,526],{},"Claude Code 默认会在提交信息中添加 AI 协作署名：",[319,528,531],{"className":529,"code":530,"language":324},[322],"feat(api): add cursor-based pagination to search endpoint\n\n- Implement keyset pagination using created_at + id composite cursor\n- Add database migration for composite index on (created_at, id)\n\nGenerated with Claude Code\nCo-Authored-By: Claude \u003Cnoreply@anthropic.com>\n",[207,532,530],{"__ignoreMap":327},[195,534,535,536,539,540,543],{},"GitHub 会识别 ",[207,537,538],{},"Co-Authored-By"," 格式，在提交详情页显示 Claude 为协作者。这提供了透明度，让团队了解代码的生成方式。如需关闭此功能，可在 ",[207,541,542],{},"~\u002F.claude\u002Fsettings.json"," 中配置：",[319,545,549],{"className":546,"code":547,"language":548,"meta":327,"style":327},"language-json shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","{\n  \"includeCoAuthoredBy\": false\n  \u002F\u002F 其他 Git 相关配置请以官方文档为准\n  \u002F\u002F https:\u002F\u002Fcode.claude.com\u002Fdocs\u002Fen\u002Fsetup\n}\n","json",[207,550,551,556,574,580,585],{"__ignoreMap":327},[443,552,553],{"class":445,"line":446},[443,554,555],{"class":449},"{\n",[443,557,558,561,565,568,571],{"class":445,"line":457},[443,559,560],{"class":449},"  \"",[443,562,564],{"class":563},"spNyl","includeCoAuthoredBy",[443,566,567],{"class":449},"\"",[443,569,570],{"class":449},":",[443,572,573],{"class":449}," false\n",[443,575,576],{"class":445,"line":464},[443,577,579],{"class":578},"sHwdD","  \u002F\u002F 其他 Git 相关配置请以官方文档为准\n",[443,581,582],{"class":445,"line":474},[443,583,584],{"class":578},"  \u002F\u002F https:\u002F\u002Fcode.claude.com\u002Fdocs\u002Fen\u002Fsetup\n",[443,586,587],{"class":445,"line":482},[443,588,589],{"class":449},"}\n",[195,591,592,593,596,597,600],{},"项目级配置可放在 ",[207,594,595],{},".claude\u002Fsettings.json","（纳入版本控制）或 ",[207,598,599],{},".claude\u002Fsettings.local.json","（个人偏好）中。",[199,602,604],{"id":603},"_3-分支管理","3. 分支管理",[195,606,607],{},"分支是并行开发的载体。Claude Code 将分支的创建、切换、同步和清理全部转化为对话操作。",[212,609,611],{"id":610},"_31-创建与切换分支","3.1 创建与切换分支",[319,613,616],{"className":614,"code":615,"language":324},[322],"User: 为支付集成功能创建一个新分支\n\nClaude: 已创建并切换到 feature\u002Fpayment-integration\n       （基于当前分支 main，commit: 8e2a1c4）\n\nUser: 切换到包含认证重构的那个分支\n\nClaude: 找到匹配分支: refactor\u002Fauth-module\n       已切换。该分支基于 main，领先 12 个 commit。\n",[207,617,615],{"__ignoreMap":327},[195,619,620,621,623],{},"如果 ",[207,622,108],{}," 中定义了分支命名规范，Claude 会自动遵循。例如：",[319,625,627],{"className":437,"code":626,"language":439,"meta":327,"style":327},"## 分支命名规范\n\n- 功能分支: feat\u002F{short-description}\n- 修复分支: fix\u002F{issue-id}-{short-description}\n- 重构分支: refactor\u002F{area}\n- 文档分支: docs\u002F{topic}\n",[207,628,629,636,640,647,654,661],{"__ignoreMap":327},[443,630,631,633],{"class":445,"line":446},[443,632,450],{"class":449},[443,634,635],{"class":453},"分支命名规范\n",[443,637,638],{"class":445,"line":457},[443,639,461],{"emptyLinePlaceholder":460},[443,641,642,644],{"class":445,"line":464},[443,643,467],{"class":449},[443,645,646],{"class":470}," 功能分支: feat\u002F{short-description}\n",[443,648,649,651],{"class":445,"line":474},[443,650,467],{"class":449},[443,652,653],{"class":470}," 修复分支: fix\u002F{issue-id}-{short-description}\n",[443,655,656,658],{"class":445,"line":482},[443,657,467],{"class":449},[443,659,660],{"class":470}," 重构分支: refactor\u002F{area}\n",[443,662,663,665],{"class":445,"line":490},[443,664,467],{"class":449},[443,666,667],{"class":470}," 文档分支: docs\u002F{topic}\n",[212,669,671],{"id":670},"_32-保持分支同步","3.2 保持分支同步",[195,673,674],{},"在功能分支上开发时，main 分支可能已有新的提交。Claude Code 支持多种同步策略：",[319,676,679],{"className":677,"code":678,"language":324},[322],"User: 把我的分支变基到最新的 main 上\n\nClaude: 正在执行: git fetch origin && git rebase origin\u002Fmain\n       变基完成，无冲突。\n       \nUser: 如果有冲突，逐个解释并让我确认后再解决\n\nClaude: 发现 2 个冲突文件：\n\n       文件 1: src\u002Fauth\u002Fhandlers.ts\n       - main 分支添加了速率限制逻辑\n       - 你的分支重构了 handler 为多个小函数\n       - 建议: 将速率限制逻辑移入你新建的 validateLogin 函数\n       \n       [展示建议的合并结果]\n       \n       确认这个解决方案吗？\n",[207,680,678],{"__ignoreMap":327},[212,682,684],{"id":683},"_33-分支清理","3.3 分支清理",[195,686,687],{},"长期积累的分支会造成混乱。Claude Code 可以智能识别可清理的分支：",[319,689,692],{"className":690,"code":691,"language":324},[322],"User: 显示哪些本地分支已经合并到 main 可以删除\n\nClaude: 以下分支已完全合并到 main：\n\n       已合并 (可安全删除):\n       - fix\u002Fauth-timeout      最后提交: 3 周前\n       - feat\u002Femail-notify     最后提交: 2 周前\n       - chore\u002Flint-config     最后提交: 1 周前\n       \n       未合并 (保留):\n       - feature\u002Fai-chat       领先 main 15 个 commit\n       - refactor\u002Fdb-layer     领先 main 8 个 commit\n       \n       要删除已合并的分支吗？\n",[207,693,691],{"__ignoreMap":327},[199,695,697],{"id":696},"_4-解决合并冲突","4. 解决合并冲突",[195,699,700],{},"合并冲突是 Git 工作流中最令人头疼的环节。Claude Code 的核心价值在于：它不是简单地让你选择\"保留我们的\"或\"保留他们的\"，而是读取冲突标记、追溯双方变更历史、用自然语言解释冲突的本质，并提议一个融合双方意图的解决方案。",[212,702,704],{"id":703},"_41-冲突解决对话流程","4.1 冲突解决对话流程",[319,706,709],{"className":707,"code":708,"language":324},[322],"User: 解决 rebase 后的所有冲突\n\nClaude: 发现 3 个冲突文件，按严重程度排序：\n\n       === 文件 1: src\u002Fapi\u002Froutes.ts (高) ===\n       \n       冲突描述:\n       - main 分支将路由注册改为异步加载模式\n       - 你的分支添加了新的 \u002Fwebhook 路由\n       \n       分析: 两个变更都需要保留。新路由需要适配异步加载模式。\n       \n       建议方案:\n       [展示合并后的代码]\n       \n       确认 \u002F 修改 \u002F 跳过这个文件？\n",[207,710,708],{"__ignoreMap":327},[195,712,713],{},"Claude Code 通过读取冲突标记和双方变更历史，用自然语言解释冲突本质并提议解决方案。对于简单文本冲突，Claude 通常能直接给出合并建议；涉及业务逻辑的冲突，建议始终要求 Claude 解释原因后再确认。",[220,715,716,726],{},[223,717,718],{},[226,719,720,723],{},[229,721,722],{},"冲突类型",[229,724,725],{},"解决策略",[239,727,728,736,744],{},[226,729,730,733],{},[244,731,732],{},"简单文本冲突",[244,734,735],{},"上下文合并",[226,737,738,741],{},[244,739,740],{},"结构性冲突（import、函数）",[244,742,743],{},"上下文理解 + 智能建议",[226,745,746,749],{},[244,747,748],{},"语义冲突（业务逻辑）",[244,750,751],{},"提议方案 + 人工确认",[212,753,755],{"id":754},"_42-冲突解决最佳实践","4.2 冲突解决最佳实践",[195,757,758,317],{},[314,759,760],{},"复制粘贴用冲突解决提示词",[319,762,765],{"className":763,"code":764,"language":324},[322],"我有 merge\u002Frebase 后的冲突。对每个冲突文件：\n\n1. 解释冲突双方各自的意图是什么\n2. 判断哪一方明显正确，或是否需要合并\n3. 展示建议的解决方案\n4. 等我确认后再解决每个文件\n\n不要自动解决。我要理解每个冲突的原因。\n",[207,766,764],{"__ignoreMap":327},[195,768,769,317],{},[314,770,771],{},"关键原则",[773,774,775,778,781],"ul",{},[394,776,777],{},"始终要求 Claude 解释冲突原因，而非直接应用修复",[394,779,780],{},"审查建议方案，特别是涉及业务逻辑的文件",[394,782,783],{},"如果 Claude 遗漏了某部分逻辑，明确指出：\"这个方案丢失了 main 分支的速率限制逻辑，需要保留\"",[199,785,787],{"id":786},"_5-代码审查辅助","5. 代码审查辅助",[195,789,790],{},"Pull Request 是团队协作的核心环节。Claude Code 可以在 PR 创建前帮你审查变更、生成摘要，并在 PR 创建后协助处理反馈。",[212,792,794],{"id":793},"_51-变更摘要与审查清单","5.1 变更摘要与审查清单",[195,796,797],{},"在创建 PR 前，先让 Claude 帮你审查：",[319,799,802],{"className":800,"code":801,"language":324},[322],"User: 总结当前分支相对于 main 的所有变更\n\nClaude: 分支 feature\u002Fpagination 相对于 main 的变更摘要：\n\n       ## 变更概览\n       - 5 个提交，涉及 7 个文件，+312\u002F-45 行\n       \n       ## 按区域分组\n       \n       数据库层:\n       - 新增复合索引 (created_at, id)\n       - 新增迁移文件\n       \n       API 层:\n       - 搜索端点支持 cursor 分页\n       - 新增分页参数校验\n       \n       测试:\n       - 分页功能的集成测试\n       - 边界条件测试（空结果、末页）\n       \n       ## 潜在关注点\n       - 新索引对写入性能的影响需关注\n       - cursor 编码使用 base64，需确认是否兼容旧客户端\n",[207,803,801],{"__ignoreMap":327},[212,805,807],{"id":806},"_52-pr-描述生成","5.2 PR 描述生成",[319,809,812],{"className":810,"code":811,"language":324},[322],"User: 为这个分支创建 PR，描述要包含测试方法和迁移步骤\n\nClaude: 已生成 PR 描述：\n\n       ## 摘要\n       为搜索端点添加基于 cursor 的分页支持，替代原有的 offset 分页。\n       \n       ## 变更内容\n       - 实现 keyset pagination，使用 created_at + id 复合 cursor\n       - 添加数据库迁移创建复合索引\n       - 更新 OpenAPI 规范\n       - 添加完整测试覆盖\n       \n       ## 测试方法\n       1. 运行 `npm test -- search.pagination`\n       2. 手动测试: `curl http:\u002F\u002Flocalhost:3000\u002Fapi\u002Fsearch?cursor=eyJpZCI6MTB9`\n       3. 验证末页响应中 `hasMore: false`\n       \n       ## 迁移步骤\n       运行 `npm run migrate:up` 应用新索引\n       \n       ## 破坏性变更\n       无。offset 参数仍受支持但标记为弃用。\n       \n       确认创建 PR 吗？\n",[207,813,811],{"__ignoreMap":327},[195,815,816,317],{},[314,817,818],{},"生产级 PR 提示词模板",[319,820,823],{"className":821,"code":822,"language":324},[322],"为这个分支创建 Pull Request，包含：\n\n1. 70 字符以内的简洁标题\n2. 2-3 个 bullet points 的变更摘要\n3. 测试方法部分，描述如何验证变更\n4. 破坏性变更或迁移步骤的说明\n5. 关联的 Issue 链接（如果有）\n\n如果分支还没 push，先 push。\n",[207,824,822],{"__ignoreMap":327},[212,826,828],{"id":827},"_53-审查反馈处理","5.3 审查反馈处理",[319,830,833],{"className":831,"code":832,"language":324},[322],"User: PR #42 有什么审查反馈？\n\nClaude: PR #42 有 3 条审查评论：\n\n       1. @alice 在 src\u002Fapi\u002Fsearch.ts:45:\n          \"cursor 解码应该有错误处理\"\n          → 建议添加 try\u002Fcatch，返回 400 错误\n       \n       2. @bob 在 tests\u002Fapi\u002Fsearch.test.ts:89:\n          \"缺少空 cursor 的测试用例\"\n          → 建议添加测试: 不传 cursor 时默认返回第一页\n       \n       3. @alice 在 migrations\u002F...:\n          \"索引应该先评估对写入性能的影响\"\n          → 建议添加性能测试或分阶段 rollout 计划\n       \n       要我逐条处理这些反馈吗？\n",[207,834,832],{"__ignoreMap":327},[199,836,838],{"id":837},"_6-github-集成","6. GitHub 集成",[195,840,841,842,845],{},"Claude Code 通过 GitHub CLI (",[207,843,844],{},"gh",") 与 GitHub 深度集成，支持 PR 创建、Issue 关联、Actions 触发等操作。",[212,847,849],{"id":848},"_61-pr-创建与管理","6.1 PR 创建与管理",[195,851,852],{},"Claude Code 支持通过交互式命令一步完成提交、推送和 PR 创建：",[319,854,857],{"className":855,"code":856,"language":324},[322],"User: 提交并创建 PR\n\nClaude: [交互式命令] \u002Fcommit-push-pr\n       已分析变更，执行以下操作：\n       1. 暂存所有变更\n       2. 生成提交信息: feat(api): add cursor-based pagination\n       3. 推送到 origin\u002Ffeature\u002Fpagination\n       4. 创建 PR #143: https:\u002F\u002Fgithub.com\u002Forg\u002Frepo\u002Fpull\u002F143\n       \n       会话已关联到 PR #143。之后可用 `claude --from-pr 143` 恢复此会话。\n",[207,858,856],{"__ignoreMap":327},[195,860,861,862,865],{},"更精细的控制可以通过 ",[207,863,864],{},"gh pr create"," 的各选项实现：",[220,867,868,881],{},[223,869,870],{},[226,871,872,875,878],{},[229,873,874],{},"操作",[229,876,877],{},"Claude 自然语言",[229,879,880],{},"底层命令",[239,882,883,896,909,922,936],{},[226,884,885,888,891],{},[244,886,887],{},"创建 PR",[244,889,890],{},"\"create a PR for this branch\"",[244,892,893],{},[207,894,895],{},"gh pr create --fill",[226,897,898,901,904],{},[244,899,900],{},"指定审查人",[244,902,903],{},"\"create PR with alice and bob as reviewers\"",[244,905,906],{},[207,907,908],{},"gh pr create --reviewer alice,bob",[226,910,911,914,917],{},[244,912,913],{},"标记为草稿",[244,915,916],{},"\"create a draft PR\"",[244,918,919],{},[207,920,921],{},"gh pr create --draft",[226,923,924,927,930],{},[244,925,926],{},"关联 Issue",[244,928,929],{},"\"create PR that closes #123\"",[244,931,932,933],{},"PR body 包含 ",[207,934,935],{},"Closes #123",[226,937,938,941,944],{},[244,939,940],{},"添加到项目",[244,942,943],{},"\"add PR to Roadmap project\"",[244,945,946],{},[207,947,948],{},"gh pr create --project \"Roadmap\"",[212,950,952],{"id":951},"_62-issue-关联","6.2 Issue 关联",[195,954,955],{},"在 PR 描述中引用 Issue 可以建立自动关联：",[319,957,960],{"className":958,"code":959,"language":324},[322],"User: 创建 PR 并关联 Issue #456\n\nClaude: 已在 PR 描述中添加 `Closes #456`。\n       当 PR 合并时，Issue #456 将自动关闭。\n",[207,961,959],{"__ignoreMap":327},[195,963,964,965,968,969,968,972,968,975,978],{},"支持的关联关键词：",[207,966,967],{},"Closes","、",[207,970,971],{},"Fixes",[207,973,974],{},"Resolves",[207,976,977],{},"Relates to","。GitHub 会在 PR 合并时自动关闭被引用的 Issue。",[212,980,982],{"id":981},"_63-actions-触发与监控","6.3 Actions 触发与监控",[195,984,985],{},"Claude Code 可以触发和监控 GitHub Actions 工作流：",[319,987,990],{"className":988,"code":989,"language":324},[322],"User: 触发部署工作流到 staging 环境\n\nClaude: 正在触发 workflow \"deploy.yml\"...\n       运行 ID: 8923456712\n       状态: 排队中\n       \n       监控链接: https:\u002F\u002Fgithub.com\u002Forg\u002Frepo\u002Factions\u002Fruns\u002F8923456712\n\nUser: 检查 CI 状态\n\nClaude: 最新 CI 状态 (PR #143):\n       - 测试: 通过 (2m 34s)\n       - 类型检查: 通过 (1m 12s)\n       - 构建: 通过 (3m 45s)\n       - 代码覆盖率: 87% (+2%)\n       \n       所有检查通过，PR 可合并。\n",[207,991,989],{"__ignoreMap":327},[195,993,994,995,998,999,1002],{},"通过 ",[207,996,997],{},"gh workflow run"," 可以手动触发支持 ",[207,1000,1001],{},"workflow_dispatch"," 事件的工作流：",[319,1004,1008],{"className":1005,"code":1006,"language":1007,"meta":327,"style":327},"language-bash shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","# 触发工作流并传入参数\ngh workflow run deploy.yml -f environment=staging -f version=1.2.3\n","bash",[207,1009,1010,1015],{"__ignoreMap":327},[443,1011,1012],{"class":445,"line":446},[443,1013,1014],{"class":578},"# 触发工作流并传入参数\n",[443,1016,1017,1019,1023,1026,1029,1032,1035,1037,1040],{"class":445,"line":457},[443,1018,844],{"class":453},[443,1020,1022],{"class":1021},"sfazB"," workflow",[443,1024,1025],{"class":1021}," run",[443,1027,1028],{"class":1021}," deploy.yml",[443,1030,1031],{"class":1021}," -f",[443,1033,1034],{"class":1021}," environment=staging",[443,1036,1031],{"class":1021},[443,1038,1039],{"class":1021}," version=",[443,1041,1043],{"class":1042},"sbssI","1.2.3\n",[199,1045,1047],{"id":1046},"_7-高级工作流","7. 高级工作流",[212,1049,1051],{"id":1050},"_71-interactive-rebase","7.1 Interactive Rebase",[195,1053,1054],{},"Interactive rebase 是整理提交历史的利器，但其语法对许多开发者来说过于晦涩。Claude Code 让你用自然语言描述 rebase 意图：",[319,1056,1059],{"className":1057,"code":1058,"language":324},[322],"User: 整理最近 5 个提交。把两个 \"fix typo\" 提交合并到前面的功能提交里，\n     并把 \"add user auth\" 的提交信息改得更详细一些\n\nClaude: 正在构建 rebase 计划：\n\n       pick    a1b2c3d  feat: add user authentication\n       squash  e4f5g6h  fix typo\n       squash  i7j8k9l  fix typo\n       reword  m0n1o2p  add user auth\n       pick    q3r4s5t  test: add auth integration tests\n       \n       执行 rebase 吗？\n",[207,1060,1058],{"__ignoreMap":327},[195,1062,1063],{},"如果 rebase 过程中出现冲突，Claude 会使用与合并冲突相同的对话式解决流程。",[212,1065,1067],{"id":1066},"_72-squash-合并","7.2 Squash 合并",[319,1069,1072],{"className":1070,"code":1071,"language":324},[322],"User: 把这个分支的所有提交压缩成一个，并写一个好的提交信息\n\nClaude: 将把 8 个提交压缩为 1 个：\n\n       新提交信息:\n       feat(api): implement cursor-based pagination\n       \n       - Replace offset pagination with keyset pagination\n       - Add composite index on (created_at, id)\n       - Update OpenAPI spec with cursor parameters\n       - Add comprehensive test coverage\n       \n       确认执行 squash 吗？\n",[207,1073,1071],{"__ignoreMap":327},[212,1075,1077],{"id":1076},"_73-cherry-pick","7.3 Cherry-Pick",[195,1079,1080],{},"Cherry-pick 用于将特定提交应用到当前分支，常用于热修复：",[319,1082,1085],{"className":1083,"code":1084,"language":324},[322],"User: 把 release 分支上的数据库迁移修复 cherry-pick 到 main\n\nClaude: 找到提交 abc1234 (fix: correct migration rollback logic)\n       正在 cherry-pick 到当前分支...\n       成功应用，无冲突。\n",[207,1086,1084],{"__ignoreMap":327},[195,1088,1089],{},"如果 cherry-pick 产生冲突，Claude 会解释冲突原因——通常是因为提交应用的上下文在两个分支中不同。",[212,1091,1093],{"id":1092},"_74-git-bisect-调试","7.4 Git Bisect 调试",[195,1095,1096,1099],{},[207,1097,1098],{},"git bisect"," 是定位引入 Bug 的提交的二分查找工具。Claude Code 可以自动化整个过程：",[319,1101,1104],{"className":1102,"code":1103,"language":324},[322],"User: 帮我 bisect，这个 Bug 是在最近 20 个提交里引入的\n\nClaude: 启动 bisect...\n       坏提交: HEAD (当前)\n       好提交: HEAD~20\n       \n       测试第 10 个提交... [自动运行测试]\n       结果: 测试通过 → 好提交\n       \n       测试第 15 个提交... [自动运行测试]\n       结果: 测试失败 → 坏提交\n       \n       ...\n       \n       找到引入 Bug 的提交: a3f7d2e\n       作者: Alice\n       时间: 3 天前\n       变更: refactor(auth): extract token validation\n       \n       要查看这个提交的详细 diff 吗？\n",[207,1105,1103],{"__ignoreMap":327},[212,1107,1109],{"id":1108},"_75-git-历史作为调试工具","7.5 Git 历史作为调试工具",[195,1111,1112],{},"Claude Code 可以将 Git 历史作为理解代码演化的工具：",[319,1114,1117],{"className":1115,"code":1116,"language":324},[322],"User: 认证超时行为最近什么时候改过的？给我看提交和 diff\n\nClaude: 找到相关提交：\n       \n       commit 8e2a1c4 (2 周前)\n       Author: Bob\n       \n       fix(auth): reduce session timeout from 30min to 15min\n       \n       - Security requirement from audit #2025-04\n       - Active users get refresh token automatically\n       - Configurable via SESSION_TIMEOUT_MINUTES env var\n\nUser: 支付模块的回归问题是谁引入的？Bug 是 1 月 15 日报的\n\nClaude: 分析 1 月 8 日-15 日的提交...\n       \n       引入回归的提交: 7d3e9f1 (1 月 12 日)\n       Author: Carol\n       \n       feat(payment): add retry logic for failed transactions\n       \n       问题: 重试逻辑未正确处理已部分完成的交易，\n       导致重复扣款。\n",[207,1118,1116],{"__ignoreMap":327},[199,1120,1122],{"id":1121},"_8-并行开发git-worktrees","8. 并行开发：Git Worktrees",[195,1124,1125],{},"Git worktrees 允许你从同一个仓库检出多个分支到不同的工作目录，共享同一份 Git 历史但拥有完全独立的文件状态。这是运行并行 Claude Code 会话的官方推荐方式。",[212,1127,1129],{"id":1128},"_81-为什么需要-worktrees","8.1 为什么需要 Worktrees",[195,1131,1132],{},"当你运行 Claude Code 时，AI 代理直接读写工作目录中的文件。如果主工作目录中有一个正在进行的任务，你无法：",[773,1134,1135,1138,1141],{},[394,1136,1137],{},"检出另一个分支处理紧急 Bug",[394,1139,1140],{},"安全地运行另一个 Claude 会话",[394,1142,1143],{},"查看其他分支的代码状态",[195,1145,1146],{},"Worktrees 解决了这个问题。每个 worktree 是一个独立的目录，有自己的分支检出，互不干扰。",[212,1148,1150],{"id":1149},"_82-claude-code-的-worktree-支持","8.2 Claude Code 的 Worktree 支持",[195,1152,1153,1154,1157,1158,1161],{},"Claude Code 通过 ",[207,1155,1156],{},"--worktree","（简写 ",[207,1159,1160],{},"-w","）标志原生支持 worktree：",[319,1163,1165],{"className":1005,"code":1164,"language":1007,"meta":327,"style":327},"# 创建新 worktree 并启动 Claude 会话\nclaude --worktree feature-payments\n\n# 等价于\nclaude -w feature-payments\n",[207,1166,1167,1172,1183,1187,1192],{"__ignoreMap":327},[443,1168,1169],{"class":445,"line":446},[443,1170,1171],{"class":578},"# 创建新 worktree 并启动 Claude 会话\n",[443,1173,1174,1177,1180],{"class":445,"line":457},[443,1175,1176],{"class":453},"claude",[443,1178,1179],{"class":1021}," --worktree",[443,1181,1182],{"class":1021}," feature-payments\n",[443,1184,1185],{"class":445,"line":464},[443,1186,461],{"emptyLinePlaceholder":460},[443,1188,1189],{"class":445,"line":474},[443,1190,1191],{"class":578},"# 等价于\n",[443,1193,1194,1196,1199],{"class":445,"line":482},[443,1195,1176],{"class":453},[443,1197,1198],{"class":1021}," -w",[443,1200,1182],{"class":1021},[195,1202,1203,1204,1207],{},"Claude 会在 ",[207,1205,1206],{},".claude\u002Fworktrees\u002Ffeature-payments\u002F"," 目录下创建隔离的 worktree，检出新分支，并将会话限定在该目录内。你的主工作树完全不受影响。",[195,1209,1210,317],{},[314,1211,1212],{},"实际工作流示例",[319,1214,1216],{"className":1005,"code":1215,"language":1007,"meta":327,"style":327},"# Terminal 1: 支付功能开发\nclaude -w feature-payments\n\n# Terminal 2: 认证 Bug 修复\nclaude -w fix-auth-timeout\n\n# Terminal 3: 数据库重构\nclaude -w refactor\u002Fdb-layer\n",[207,1217,1218,1223,1231,1235,1240,1249,1253,1258],{"__ignoreMap":327},[443,1219,1220],{"class":445,"line":446},[443,1221,1222],{"class":578},"# Terminal 1: 支付功能开发\n",[443,1224,1225,1227,1229],{"class":445,"line":457},[443,1226,1176],{"class":453},[443,1228,1198],{"class":1021},[443,1230,1182],{"class":1021},[443,1232,1233],{"class":445,"line":464},[443,1234,461],{"emptyLinePlaceholder":460},[443,1236,1237],{"class":445,"line":474},[443,1238,1239],{"class":578},"# Terminal 2: 认证 Bug 修复\n",[443,1241,1242,1244,1246],{"class":445,"line":482},[443,1243,1176],{"class":453},[443,1245,1198],{"class":1021},[443,1247,1248],{"class":1021}," fix-auth-timeout\n",[443,1250,1251],{"class":445,"line":490},[443,1252,461],{"emptyLinePlaceholder":460},[443,1254,1255],{"class":445,"line":498},[443,1256,1257],{"class":578},"# Terminal 3: 数据库重构\n",[443,1259,1261,1263,1265],{"class":445,"line":1260},8,[443,1262,1176],{"class":453},[443,1264,1198],{"class":1021},[443,1266,1267],{"class":1021}," refactor\u002Fdb-layer\n",[195,1269,1270],{},"三个 Claude 会话同时运行，各自处理不同的任务，零干扰。",[212,1272,1274],{"id":1273},"_83-手动-worktree-管理","8.3 手动 Worktree 管理",[195,1276,1277],{},"如果你偏好手动控制，也可以使用原生 Git 命令：",[319,1279,1281],{"className":1005,"code":1280,"language":1007,"meta":327,"style":327},"# 创建新 worktree 并同时创建新分支\ngit worktree add ..\u002Fmyproject-feature-a -b feature\u002Fnotifications\n\n# 为已有分支创建 worktree\ngit worktree add ..\u002Fmyproject-hotfix hotfix\u002Fauth-timeout\n\n# 列出所有 worktree\ngit worktree list\n\n# 移除 worktree\ngit worktree remove ..\u002Fmyproject-feature-a\n\n# 清理已不存在的 worktree 记录\ngit worktree prune\n",[207,1282,1283,1288,1308,1312,1317,1331,1335,1340,1349,1354,1360,1373,1378,1384],{"__ignoreMap":327},[443,1284,1285],{"class":445,"line":446},[443,1286,1287],{"class":578},"# 创建新 worktree 并同时创建新分支\n",[443,1289,1290,1293,1296,1299,1302,1305],{"class":445,"line":457},[443,1291,1292],{"class":453},"git",[443,1294,1295],{"class":1021}," worktree",[443,1297,1298],{"class":1021}," add",[443,1300,1301],{"class":1021}," ..\u002Fmyproject-feature-a",[443,1303,1304],{"class":1021}," -b",[443,1306,1307],{"class":1021}," feature\u002Fnotifications\n",[443,1309,1310],{"class":445,"line":464},[443,1311,461],{"emptyLinePlaceholder":460},[443,1313,1314],{"class":445,"line":474},[443,1315,1316],{"class":578},"# 为已有分支创建 worktree\n",[443,1318,1319,1321,1323,1325,1328],{"class":445,"line":482},[443,1320,1292],{"class":453},[443,1322,1295],{"class":1021},[443,1324,1298],{"class":1021},[443,1326,1327],{"class":1021}," ..\u002Fmyproject-hotfix",[443,1329,1330],{"class":1021}," hotfix\u002Fauth-timeout\n",[443,1332,1333],{"class":445,"line":490},[443,1334,461],{"emptyLinePlaceholder":460},[443,1336,1337],{"class":445,"line":498},[443,1338,1339],{"class":578},"# 列出所有 worktree\n",[443,1341,1342,1344,1346],{"class":445,"line":1260},[443,1343,1292],{"class":453},[443,1345,1295],{"class":1021},[443,1347,1348],{"class":1021}," list\n",[443,1350,1352],{"class":445,"line":1351},9,[443,1353,461],{"emptyLinePlaceholder":460},[443,1355,1357],{"class":445,"line":1356},10,[443,1358,1359],{"class":578},"# 移除 worktree\n",[443,1361,1363,1365,1367,1370],{"class":445,"line":1362},11,[443,1364,1292],{"class":453},[443,1366,1295],{"class":1021},[443,1368,1369],{"class":1021}," remove",[443,1371,1372],{"class":1021}," ..\u002Fmyproject-feature-a\n",[443,1374,1376],{"class":445,"line":1375},12,[443,1377,461],{"emptyLinePlaceholder":460},[443,1379,1381],{"class":445,"line":1380},13,[443,1382,1383],{"class":578},"# 清理已不存在的 worktree 记录\n",[443,1385,1387,1389,1391],{"class":445,"line":1386},14,[443,1388,1292],{"class":453},[443,1390,1295],{"class":1021},[443,1392,1393],{"class":1021}," prune\n",[195,1395,1396,317],{},[314,1397,1398],{},"目录结构示例",[319,1400,1403],{"className":1401,"code":1402,"language":324},[322],"\u002Fprojects\u002F\n├── my-project\u002F          # 主工作树 (main 分支)\n│   └── .git\u002F            # 实际的 Git 仓库数据\n│\n├── auth-refactor\u002F       # worktree (feat\u002Fauth-refactor)\n│   └── .git             # 指向主仓库的链接文件\n│\n├── ai-chat-feature\u002F     # worktree (feat\u002Fai-chat)\n│   └── .git\n│\n└── bug-fix-patch\u002F       # worktree (fix\u002Fbug-patch)\n    └── .git\n",[207,1404,1402],{"__ignoreMap":327},[212,1406,1408],{"id":1407},"_84-worktree-最佳实践","8.4 Worktree 最佳实践",[391,1410,1411,1448,1457,1463,1469],{},[394,1412,1413,1423,1424],{},[314,1414,1415,1416,1419,1420],{},"将 ",[207,1417,1418],{},".claude\u002Fworktrees"," 加入 ",[207,1421,1422],{},".gitignore","：避免 worktree 目录被意外提交",[319,1425,1427],{"className":1005,"code":1426,"language":1007,"meta":327,"style":327},"echo \".claude\u002Fworktrees\" >> .gitignore\n",[207,1428,1429],{"__ignoreMap":327},[443,1430,1431,1435,1438,1440,1442,1445],{"class":445,"line":446},[443,1432,1434],{"class":1433},"s2Zo4","echo",[443,1436,1437],{"class":449}," \"",[443,1439,1418],{"class":1021},[443,1441,567],{"class":449},[443,1443,1444],{"class":449}," >>",[443,1446,1447],{"class":1021}," .gitignore\n",[394,1449,1450,1453,1454,1456],{},[314,1451,1452],{},"退出时清理","：使用 ",[207,1455,1156],{}," 启动的 Claude 会话在退出时会询问是否保留 worktree。工作已完成则选择删除，计划继续则保留",[394,1458,1459,1462],{},[314,1460,1461],{},"避免同一分支多 worktree","：Git 禁止同一分支在多个 worktree 中同时检出",[394,1464,1465,1468],{},[314,1466,1467],{},"注意 stash 共享","：stash 存储在 Git 对象库中，对所有 worktree 可见。使用 worktree 时尽量避免 stash，这正是 worktree 要解决的问题",[394,1470,1471,1474,1475],{},[314,1472,1473],{},"Rebase Before PR","：在创建 PR 前，始终先 rebase 到最新的 main，保持线性历史",[319,1476,1479],{"className":1477,"code":1478,"language":324},[322],"git fetch origin\ngit rebase origin\u002Fmain\ngit push --force-with-lease\n",[207,1480,1478],{"__ignoreMap":327},[199,1482,1484],{"id":1483},"_9-会话与-git-状态的关联","9. 会话与 Git 状态的关联",[195,1486,1487],{},"Claude Code 会话与目录绑定，而非与分支绑定。当你切换分支时，Claude 仍然保留对话历史，但会读取新分支的文件。这意味着你可以：",[773,1489,1490,1493,1496],{},[394,1491,1492],{},"在功能分支上启动会话",[394,1494,1495],{},"切换到 main 查看某段代码",[394,1497,1498],{},"切换回原分支继续工作",[212,1500,1502],{"id":1501},"_91-恢复会话","9.1 恢复会话",[319,1504,1506],{"className":1005,"code":1505,"language":1007,"meta":327,"style":327},"# 继续最近的会话\nclaude -c\n\n# 从会话列表中选择\nclaude --resume\n\n# 从特定 PR 恢复会话\nclaude --from-pr 142\n",[207,1507,1508,1513,1520,1524,1529,1536,1540,1545],{"__ignoreMap":327},[443,1509,1510],{"class":445,"line":446},[443,1511,1512],{"class":578},"# 继续最近的会话\n",[443,1514,1515,1517],{"class":445,"line":457},[443,1516,1176],{"class":453},[443,1518,1519],{"class":1021}," -c\n",[443,1521,1522],{"class":445,"line":464},[443,1523,461],{"emptyLinePlaceholder":460},[443,1525,1526],{"class":445,"line":474},[443,1527,1528],{"class":578},"# 从会话列表中选择\n",[443,1530,1531,1533],{"class":445,"line":482},[443,1532,1176],{"class":453},[443,1534,1535],{"class":1021}," --resume\n",[443,1537,1538],{"class":445,"line":490},[443,1539,461],{"emptyLinePlaceholder":460},[443,1541,1542],{"class":445,"line":498},[443,1543,1544],{"class":578},"# 从特定 PR 恢复会话\n",[443,1546,1547,1549,1552],{"class":445,"line":1260},[443,1548,1176],{"class":453},[443,1550,1551],{"class":1021}," --from-pr",[443,1553,1554],{"class":1042}," 142\n",[195,1556,1557,1558,1561],{},"在会话选择界面中，可以按 ",[207,1559,1560],{},"B"," 键按分支过滤。",[212,1563,1565],{"id":1564},"_92-检查点checkpoint","9.2 检查点（Checkpoint）",[195,1567,1568],{},"检查点是 Claude Code 的内部机制，与 Git commit 不同。它在代码之外还保存了对话上下文：",[319,1570,1573],{"className":1571,"code":1572,"language":324},[322],"User: 在重构认证模块前创建一个检查点\n\nClaude: 已创建检查点。\n       代码状态 + 对话上下文已保存。\n       可随时恢复到此状态。\n",[207,1574,1572],{"__ignoreMap":327},[199,1576,1578],{"id":1577},"_10-配置与最佳实践","10. 配置与最佳实践",[212,1580,1582],{"id":1581},"_101-claudemd-中的-git-配置","10.1 CLAUDE.md 中的 Git 配置",[195,1584,1585,1586,1588],{},"在 ",[207,1587,108],{}," 中定义 Git 规则，让 Claude 自动遵循：",[319,1590,1592],{"className":437,"code":1591,"language":439,"meta":327,"style":327},"## Git 规范\n\n### 提交格式\n- 使用 Conventional Commits，英文\n- 分支前缀: feat\u002F, fix\u002F, chore\u002F, refactor\u002F, docs\u002F\n- PR 必须包含描述和测试清单\n- 合并策略: 使用 rebase 保持线性历史\n\n### 分支保护\n- 禁止直接 push 到 main\n- PR 需要至少 1 个审查人批准\n- CI 通过后方可合并\n\n### 工作流\n- 功能开发: 从 main 切出 feature 分支\n- 修复: 从 main 切出 fix 分支，cherry-pick 到 release\n- 发布: 使用 squash merge 到 main\n",[207,1593,1594,1601,1605,1613,1620,1627,1634,1641,1645,1652,1659,1666,1673,1677,1684,1692,1700],{"__ignoreMap":327},[443,1595,1596,1598],{"class":445,"line":446},[443,1597,450],{"class":449},[443,1599,1600],{"class":453},"Git 规范\n",[443,1602,1603],{"class":445,"line":457},[443,1604,461],{"emptyLinePlaceholder":460},[443,1606,1607,1610],{"class":445,"line":464},[443,1608,1609],{"class":449},"### ",[443,1611,1612],{"class":453},"提交格式\n",[443,1614,1615,1617],{"class":445,"line":474},[443,1616,467],{"class":449},[443,1618,1619],{"class":470}," 使用 Conventional Commits，英文\n",[443,1621,1622,1624],{"class":445,"line":482},[443,1623,467],{"class":449},[443,1625,1626],{"class":470}," 分支前缀: feat\u002F, fix\u002F, chore\u002F, refactor\u002F, docs\u002F\n",[443,1628,1629,1631],{"class":445,"line":490},[443,1630,467],{"class":449},[443,1632,1633],{"class":470}," PR 必须包含描述和测试清单\n",[443,1635,1636,1638],{"class":445,"line":498},[443,1637,467],{"class":449},[443,1639,1640],{"class":470}," 合并策略: 使用 rebase 保持线性历史\n",[443,1642,1643],{"class":445,"line":1260},[443,1644,461],{"emptyLinePlaceholder":460},[443,1646,1647,1649],{"class":445,"line":1351},[443,1648,1609],{"class":449},[443,1650,1651],{"class":453},"分支保护\n",[443,1653,1654,1656],{"class":445,"line":1356},[443,1655,467],{"class":449},[443,1657,1658],{"class":470}," 禁止直接 push 到 main\n",[443,1660,1661,1663],{"class":445,"line":1362},[443,1662,467],{"class":449},[443,1664,1665],{"class":470}," PR 需要至少 1 个审查人批准\n",[443,1667,1668,1670],{"class":445,"line":1375},[443,1669,467],{"class":449},[443,1671,1672],{"class":470}," CI 通过后方可合并\n",[443,1674,1675],{"class":445,"line":1380},[443,1676,461],{"emptyLinePlaceholder":460},[443,1678,1679,1681],{"class":445,"line":1386},[443,1680,1609],{"class":449},[443,1682,1683],{"class":453},"工作流\n",[443,1685,1687,1689],{"class":445,"line":1686},15,[443,1688,467],{"class":449},[443,1690,1691],{"class":470}," 功能开发: 从 main 切出 feature 分支\n",[443,1693,1695,1697],{"class":445,"line":1694},16,[443,1696,467],{"class":449},[443,1698,1699],{"class":470}," 修复: 从 main 切出 fix 分支，cherry-pick 到 release\n",[443,1701,1703,1705],{"class":445,"line":1702},17,[443,1704,467],{"class":449},[443,1706,1707],{"class":470}," 发布: 使用 squash merge 到 main\n",[195,1709,1710,1711,1713],{},"配置良好的 ",[207,1712,108],{}," 能帮助 Claude 理解团队 Git 规范，减少因规范不一致导致的额外沟通成本。",[212,1715,1717],{"id":1716},"_102-常见陷阱与规避","10.2 常见陷阱与规避",[220,1719,1720,1733],{},[223,1721,1722],{},[226,1723,1724,1727,1730],{},[229,1725,1726],{},"问题",[229,1728,1729],{},"原因",[229,1731,1732],{},"解决方案",[239,1734,1735,1746,1761,1772,1783],{},[226,1736,1737,1740,1743],{},[244,1738,1739],{},"Claude 提交了不想要的文件",[244,1741,1742],{},"指令不够精确",[244,1744,1745],{},"明确指定文件范围，或先手动暂存",[226,1747,1748,1751,1756],{},[244,1749,1750],{},"提交信息不符合团队规范",[244,1752,1753,1755],{},[207,1754,108],{}," 未配置",[244,1757,1585,1758,1760],{},[207,1759,108],{}," 中声明提交格式",[226,1762,1763,1766,1769],{},[244,1764,1765],{},"冲突解决丢失重要变更",[244,1767,1768],{},"未审查建议方案",[244,1770,1771],{},"要求 Claude 逐个解释冲突",[226,1773,1774,1777,1780],{},[244,1775,1776],{},"PR 描述过于通用",[244,1778,1779],{},"指令不够具体",[244,1781,1782],{},"明确列出 PR 描述应包含的章节",[226,1784,1785,1788,1791],{},[244,1786,1787],{},"Worktree 会话互相干扰",[244,1789,1790],{},"同一目录运行多个 Claude",[244,1792,1793],{},"每个 Claude 实例使用独立 worktree",[212,1795,1797],{"id":1796},"_103-最佳实践清单","10.3 最佳实践清单",[773,1799,1800,1814,1820,1826,1832,1838],{},[394,1801,1802,1805,1806,1809,1810,1813],{},[314,1803,1804],{},"审查 Claude 的提交","：推送前运行 ",[207,1807,1808],{},"git log --oneline -5"," 和 ",[207,1811,1812],{},"git diff HEAD~1"," 检查",[394,1815,1816,1819],{},[314,1817,1818],{},"小粒度提交","：小而聚焦的提交让 Claude 生成更精确的提交信息，也便于 bisect 调试",[394,1821,1822,1825],{},[314,1823,1824],{},"描述性分支名","：帮助 Claude 理解上下文，生成更好的 PR 描述",[394,1827,1828,1831],{},[314,1829,1830],{},"显式声明提交规范","：如果使用 Conventional Commits 等标准，明确告知 Claude",[394,1833,1834,1837],{},[314,1835,1836],{},"利用 Claude 进行 Git 考古","：用自然语言查询历史，快速定位变更原因",[394,1839,1840,1846],{},[314,1841,1842,1843],{},"大仓库使用 ",[207,1844,1845],{},"\u002Fcompact","：帮助 Claude 高效管理上下文",[199,1848,1849],{"id":1849},"参考来源",[773,1851,1852,1861,1868,1875,1882,1889,1896,1903,1910],{},[394,1853,1854],{},[1855,1856,1860],"a",{"href":1857,"rel":1858},"https:\u002F\u002Fdevelopertoolkit.ai\u002Fen\u002Fclaude-code\u002Fquick-start\u002Fversion-control\u002F",[1859],"nofollow","Developer Toolkit - Version Control: Git Integration and PR Workflow",[394,1862,1863],{},[1855,1864,1867],{"href":1865,"rel":1866},"https:\u002F\u002Finstitute.sfeir.com\u002Fen\u002Fclaude-code\u002Fclaude-code-git-integration\u002Ftutorial\u002F",[1859],"SFEIR Institute - Git Integration Tutorial",[394,1869,1870],{},[1855,1871,1874],{"href":1872,"rel":1873},"https:\u002F\u002Fwww.deployhq.com\u002Fblog\u002Fhow-to-use-git-with-claude-code-understanding-the-co-authored-by-attribution",[1859],"DeployHQ - How to Use Git with Claude Code",[394,1876,1877],{},[1855,1878,1881],{"href":1879,"rel":1880},"https:\u002F\u002Fwww.eesel.ai\u002Fblog\u002Fgit-workflows-claude-code",[1859],"Eesel AI - A Practical Guide to Automating Git Workflows with Claude Code",[394,1883,1884],{},[1855,1885,1888],{"href":1886,"rel":1887},"https:\u002F\u002Fgetbeam.dev\u002Fblog\u002Fclaude-code-git-workflows.html",[1859],"Beam Terminal - How to Use Claude Code with Git: Advanced Workflows",[394,1890,1891],{},[1855,1892,1895],{"href":1893,"rel":1894},"https:\u002F\u002Fdev.to\u002Fyooi\u002Fparallel-development-with-claudecode-and-git-worktrees-305a",[1859],"DEV Community - Parallel Development with ClaudeCode and Git Worktrees",[394,1897,1898],{},[1855,1899,1902],{"href":1900,"rel":1901},"https:\u002F\u002Fwww.dandoescode.com\u002Fblog\u002Fparallel-vibe-coding-with-git-worktrees",[1859],"Dan Does Code - Parallel Vibe Coding with Git Worktrees",[394,1904,1905],{},[1855,1906,1909],{"href":1907,"rel":1908},"https:\u002F\u002Fcli.github.com\u002Fmanual\u002Fgh_pr_create",[1859],"GitHub CLI Manual - gh pr create",[394,1911,1912],{},[1855,1913,1916],{"href":1914,"rel":1915},"https:\u002F\u002Fdocs.github.com\u002Fen\u002Factions\u002Fhow-tos\u002Fwrite-workflows\u002Fchoose-what-workflows-do\u002Fuse-github-cli",[1859],"GitHub Docs - Using GitHub CLI in Workflows",[1918,1919,1920],"style",{},"html pre.shiki code .sMK4o, html code.shiki .sMK4o{--shiki-light:#39ADB5;--shiki-default:#89DDFF;--shiki-dark:#89DDFF}html pre.shiki code .sBMFI, html code.shiki .sBMFI{--shiki-light:#E2931D;--shiki-default:#FFCB6B;--shiki-dark:#FFCB6B}html pre.shiki code .sTEyZ, html code.shiki .sTEyZ{--shiki-light:#90A4AE;--shiki-default:#EEFFFF;--shiki-dark:#BABED8}html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html pre.shiki code .spNyl, html code.shiki .spNyl{--shiki-light:#9C3EDA;--shiki-default:#C792EA;--shiki-dark:#C792EA}html pre.shiki code .sHwdD, html code.shiki .sHwdD{--shiki-light:#90A4AE;--shiki-light-font-style:italic;--shiki-default:#546E7A;--shiki-default-font-style:italic;--shiki-dark:#676E95;--shiki-dark-font-style:italic}html pre.shiki code .sfazB, html code.shiki .sfazB{--shiki-light:#91B859;--shiki-default:#C3E88D;--shiki-dark:#C3E88D}html pre.shiki code .sbssI, html code.shiki .sbssI{--shiki-light:#F76D47;--shiki-default:#F78C6C;--shiki-dark:#F78C6C}html pre.shiki code .s2Zo4, html code.shiki .s2Zo4{--shiki-light:#6182B8;--shiki-default:#82AAFF;--shiki-dark:#82AAFF}",{"title":327,"searchDepth":446,"depth":457,"links":1922},[1923,1928,1934,1939,1943,1948,1953,1960,1966,1970,1975],{"id":201,"depth":457,"text":202,"children":1924},[1925,1926,1927],{"id":214,"depth":464,"text":215},{"id":330,"depth":464,"text":331},{"id":354,"depth":464,"text":355},{"id":378,"depth":457,"text":379,"children":1929},[1930,1931,1932,1933],{"id":385,"depth":464,"text":386},{"id":427,"depth":464,"text":428},{"id":509,"depth":464,"text":510},{"id":522,"depth":464,"text":523},{"id":603,"depth":457,"text":604,"children":1935},[1936,1937,1938],{"id":610,"depth":464,"text":611},{"id":670,"depth":464,"text":671},{"id":683,"depth":464,"text":684},{"id":696,"depth":457,"text":697,"children":1940},[1941,1942],{"id":703,"depth":464,"text":704},{"id":754,"depth":464,"text":755},{"id":786,"depth":457,"text":787,"children":1944},[1945,1946,1947],{"id":793,"depth":464,"text":794},{"id":806,"depth":464,"text":807},{"id":827,"depth":464,"text":828},{"id":837,"depth":457,"text":838,"children":1949},[1950,1951,1952],{"id":848,"depth":464,"text":849},{"id":951,"depth":464,"text":952},{"id":981,"depth":464,"text":982},{"id":1046,"depth":457,"text":1047,"children":1954},[1955,1956,1957,1958,1959],{"id":1050,"depth":464,"text":1051},{"id":1066,"depth":464,"text":1067},{"id":1076,"depth":464,"text":1077},{"id":1092,"depth":464,"text":1093},{"id":1108,"depth":464,"text":1109},{"id":1121,"depth":457,"text":1122,"children":1961},[1962,1963,1964,1965],{"id":1128,"depth":464,"text":1129},{"id":1149,"depth":464,"text":1150},{"id":1273,"depth":464,"text":1274},{"id":1407,"depth":464,"text":1408},{"id":1483,"depth":457,"text":1484,"children":1967},[1968,1969],{"id":1501,"depth":464,"text":1502},{"id":1564,"depth":464,"text":1565},{"id":1577,"depth":457,"text":1578,"children":1971},[1972,1973,1974],{"id":1581,"depth":464,"text":1582},{"id":1716,"depth":464,"text":1717},{"id":1796,"depth":464,"text":1797},{"id":1849,"depth":457,"text":1849},"md",null,{"date":1979},"2026-04-26",{"title":94,"description":197},"0flYQASEQIDyIvSxsfc1TNoO1x3hBCKKywRaWH8QB14",[1983,1985],{"title":90,"path":91,"stem":92,"description":1984,"children":-1},"测试与调试是软件开发的两大支柱，也是 Claude Code 展现其 Agentic 能力最充分的场景之一。不同于传统 IDE 中孤立的代码补全或静态分析，Claude Code 能够在一个连续的代理循环中完成\"编写测试 → 运行测试 → 解析失败 → 定位 Bug → 修复代码 → 验证通过\"的完整闭环。本章将深入探讨如何利用 Claude Code 进行高效的测试驱动开发、自动化测试生成、迭代式 Bug 修复以及复杂问题的系统性调试。",{"title":98,"path":99,"stem":100,"description":1986,"children":-1},"Claude Code 的核心能力不仅在于代码理解与生成，更在于它能深度集成并执行开发者日常使用的各类工具链。从 Git 操作、包管理、构建编译到数据库迁移、云部署，Claude Code 通过内置工具系统、MCP 协议扩展、Skills 自定义命令和 Hooks 自动化机制，将 AI 助手从\"建议者\"转变为\"执行者\"。本章将系统梳理 Claude Code 的工具链执行能力，涵盖原生集成、安全机制、自定义扩展等各个层面。",1777395308389]