From 73f6daa88673d21162b02750a39751e480511557 Mon Sep 17 00:00:00 2001 From: liushunqiu <402349563@qq.com> Date: Mon, 14 Sep 2026 11:29:55 +0800 Subject: [PATCH] feat(io.github.liushunqiu.pi-idea-git): add IDEA Git tool window --- README.md | 1 + README.zh-CN.md | 1 + catalog.json | 57 +- ...github.liushunqiu.pi-idea-git-0.3.0.piplug | Bin 0 -> 1057159 bytes .../CHANGELOG.md | 42 + .../io.github.liushunqiu.pi-idea-git/LICENSE | 21 + .../README.md | 527 ++ .../io.github.liushunqiu.pi-idea-git/main.js | 3326 +++++++ .../manifest.json | 106 + .../renderer/index.html | 7752 +++++++++++++++++ .../views/commit.html | 7752 +++++++++++++++++ .../views/git.html | 7752 +++++++++++++++++ tests/panel-chrome.test.mjs | 2 +- tests/pi-idea-git.test.mjs | 69 + 14 files changed, 27406 insertions(+), 2 deletions(-) create mode 100644 packages/io.github.liushunqiu.pi-idea-git-0.3.0.piplug create mode 100644 plugins/io.github.liushunqiu.pi-idea-git/CHANGELOG.md create mode 100644 plugins/io.github.liushunqiu.pi-idea-git/LICENSE create mode 100644 plugins/io.github.liushunqiu.pi-idea-git/README.md create mode 100644 plugins/io.github.liushunqiu.pi-idea-git/main.js create mode 100644 plugins/io.github.liushunqiu.pi-idea-git/manifest.json create mode 100644 plugins/io.github.liushunqiu.pi-idea-git/renderer/index.html create mode 100644 plugins/io.github.liushunqiu.pi-idea-git/views/commit.html create mode 100644 plugins/io.github.liushunqiu.pi-idea-git/views/git.html create mode 100644 tests/pi-idea-git.test.mjs diff --git a/README.md b/README.md index 5a3ef61..e695c0b 100644 --- a/README.md +++ b/README.md @@ -40,6 +40,7 @@ Contains plugin sources, installable `.piplug` packages, and the generated marke | **pi.log-viewer** | Large log viewer with streaming pagination, live tail, search highlighting and multi-file tabs | Tioit-Wang | | **pi.bianqian** | Markdown desktop sticky notes: multi-note, live preview, task lists, highlighter and trash | ZY | | **io.github.muzimu217.session-import** | Universal session import + forge: bring sessions in from ZCode, WorkBuddy, Claude Code, Codex, OpenCode and Pi, then distill them into project conventions and reusable practices | muzimu217 | +| **io.github.liushunqiu.pi-idea-git** | IDEA-style Git tool window: staged/unstaged change lists, hunk-level stage & revert, commit, branch switcher, graph log and stashes | liushunqiu | ### Demos diff --git a/README.zh-CN.md b/README.zh-CN.md index 5122230..8879020 100644 --- a/README.zh-CN.md +++ b/README.zh-CN.md @@ -39,6 +39,7 @@ | **pi.log-viewer** | 大日志查看器:流式分页、实时跟随、搜索高亮、多文件页签 | Tioit-Wang | | **pi.bianqian** | Markdown 桌面便签:多便签、实时预览、任务列表、荧光笔与回收站 | ZY | | **io.github.muzimu217.session-import** | 一体化会话导入与熔炉:导入 ZCode、WorkBuddy、Claude Code、Codex、OpenCode、Pi 的会话,再蒸馏成项目约定与可复用做法 | muzimu217 | +| **io.github.liushunqiu.pi-idea-git** | IDEA 风格 Git 工具窗口:暂存/未暂存分组、按代码块暂存与还原、提交、分支切换、图形化日志与储藏 | liushunqiu | ### 示例插件(学习参考) diff --git a/catalog.json b/catalog.json index 1ff631e..149759e 100644 --- a/catalog.json +++ b/catalog.json @@ -2,7 +2,7 @@ "schemaVersion": 1, "providerId": "official", "name": "PI-Desktop Official Plugins", - "updatedAt": "2026-09-13T13:55:42Z", + "updatedAt": "2026-09-14T03:28:52Z", "homepage": "https://github.com/vastsa/pi-desktop-plugins", "plugins": [ { @@ -150,6 +150,61 @@ } ] }, + { + "id": "io.github.liushunqiu.pi-idea-git", + "name": "IDEA Git", + "description": "An IntelliJ-IDEA-style Git tool window for PI-Desktop: staged/unstaged change lists, hunk-level stage & revert, commit, branch switcher, graph log and stashes. IDEA Git \u98ce\u683c\u7684 Git \u5de5\u5177\u7a97\u53e3\uff1a\u6682\u5b58/\u672a\u6682\u5b58\u5206\u7ec4\u3001\u6309\u4ee3\u7801\u5757\u6682\u5b58\u4e0e\u8fd8\u539f\u3001\u63d0\u4ea4\u3001\u5206\u652f\u5207\u6362\u3001\u56fe\u5f62\u5316\u65e5\u5fd7\u4e0e\u50a8\u85cf\u3002", + "i18n": { + "en": { + "name": "IDEA Git", + "description": "An IntelliJ-IDEA-style Git tool window for PI-Desktop: staged/unstaged change lists, hunk-level stage & revert, commit, branch switcher, graph log and stashes.", + "safetyNotes": "Reads workspace files through the host fs APIs (Open File / Reveal only); discarding an untracked file deletes it (with a confirmation dialog) \u2014 every other write goes through Git commands. Commit-message generation calls the host model with your own model setup and quota (host rate limit 8/min); the plugin holds no API keys, makes no network requests, no telemetry. HTTPS credentials come from your own Git credential helper; keys that live only in ssh-agent do not work \u2014 use an HTTPS remote or a keychain-backed key." + }, + "zh-CN": { + "name": "IDEA Git", + "description": "PI-Desktop \u7684 IDEA \u98ce\u683c Git \u5de5\u5177\u7a97\u53e3\uff1a\u6682\u5b58/\u672a\u6682\u5b58\u5206\u7ec4\u3001\u6309\u4ee3\u7801\u5757\u6682\u5b58\u4e0e\u8fd8\u539f\u3001\u63d0\u4ea4\u3001\u5206\u652f\u5207\u6362\u3001\u56fe\u5f62\u5316\u65e5\u5fd7\u4e0e\u50a8\u85cf\u3002", + "safetyNotes": "\u53ea\u8bfb\u5de5\u4f5c\u533a\u6587\u4ef6\uff08Open File / Reveal \u8d70\u5bbf\u4e3b fs \u63a5\u53e3\uff09\uff1b\u4e22\u5f03\u672a\u8ddf\u8e2a\u6587\u4ef6\u65f6\u4f1a\u76f4\u63a5\u5220\u9664\u8be5\u6587\u4ef6\uff08\u64cd\u4f5c\u524d\u6709\u786e\u8ba4\u6846\uff09\uff0c\u5176\u4f59\u5199\u64cd\u4f5c\u4e00\u5f8b\u8d70 Git \u547d\u4ee4\u3002\u751f\u6210\u63d0\u4ea4\u4fe1\u606f\u8c03\u7528\u5bbf\u4e3b\u6a21\u578b\uff0c\u7528\u7684\u662f\u4f60\u81ea\u5df1\u7684\u6a21\u578b\u914d\u7f6e\u4e0e\u989d\u5ea6\uff08\u5bbf\u4e3b\u9650\u6d41 8 \u6b21/\u5206\uff09\uff0c\u63d2\u4ef6\u4e0d\u6301\u6709\u4efb\u4f55 API Key\uff0c\u4e0d\u53d1\u8d77\u7f51\u7edc\u8bf7\u6c42\uff0c\u65e0\u9065\u6d4b\u3002HTTPS \u51ed\u636e\u8d70\u4f60\u81ea\u5df1\u7684 Git \u51ed\u636e\u52a9\u624b\uff1b\u53ea\u6d3b\u5728 ssh-agent \u91cc\u7684\u5bc6\u94a5\u7528\u4e0d\u4e86\uff0c\u8bf7\u7528 HTTPS \u8fdc\u7aef\u6216\u94a5\u5319\u4e32\u5bc6\u94a5\u3002" + } + }, + "author": "liushunqiu", + "categories": [ + "developer-tools", + "productivity" + ], + "verified": true, + "downloads": 0, + "homepage": "https://github.com/vastsa/pi-desktop-plugins/tree/main/plugins/io.github.liushunqiu.pi-idea-git", + "repository": "https://github.com/vastsa/pi-desktop-plugins", + "readmeMarkdown": "# IDEA Git \u2014\u2014 PI-Desktop \u7684 IntelliJ IDEA \u98ce\u683c Git \u5de5\u5177\u7a97\u53e3\n\n`io.github.liushunqiu.pi-idea-git` \u628a IntelliJ IDEA \u7684 Git \u754c\u9762\u642c\u8fdb PI-Desktop\uff1a\u4f60\u771f\u7684\u4f1a\u4e00\u76f4\u5f85\u5728\u91cc\u9762\u7684\u90a3\u4e24\u4e2a\n\u5de5\u5177\u7a97\u53e3\u3001\u6682\u5b58/\u672a\u6682\u5b58\u5206\u7ec4\u3001\u6309\u4ee3\u7801\u5757\uff08hunk\uff09\u6682\u5b58\u3001\u56fe\u5f62\u5316\u65e5\u5fd7\u4e0e Console\u3002\n\n\u8fd9\u91cc\u7684\u6bcf\u4e00\u4e2a Git \u52a8\u4f5c\u90fd\u662f**\u771f\u7684\u53bb\u8c03 `git`**\uff0c\u5bf9\u7740\u771f\u5b9e\u7684\u7d22\u5f15\u5e72\u6d3b\u3002\u6ca1\u6709\u4efb\u4f55\u529f\u80fd\u662f\u5728\u6e32\u67d3\u5c42\n\u5047\u88c5\u51fa\u6765\u7684\uff0c\u6240\u4ee5\u7ec8\u7aef\u91cc\u7684 `git status` \u6c38\u8fdc\u548c\u9762\u677f\u663e\u793a\u4e00\u81f4\u3002\n\n\u2014\u2014 \u4ee5\u4e0b\u5185\u5bb9\u6309\u300c\u80fd\u770b\u5230\u4ec0\u4e48 \u2192 \u600e\u4e48\u7528 \u2192 \u4e3a\u4ec0\u4e48\u8fd9\u6837\u5b9e\u73b0 \u2192 \u600e\u4e48\u6539\u300d\u6392\u5217\u3002\n\n| \u7ae0\u8282 | \u5185\u5bb9 |\n| --- | --- |\n| \u754c\u9762\u4e0e\u529f\u80fd | \u4e24\u4e2a\u89c6\u56fe\u3001Changes \u533a\u3001diff \u9762\u677f\u3001Log/Console \u5168\u90e8\u80fd\u529b\u8868 |\n| \u5feb\u6377\u952e | \u7ed1\u5b9a\u8868\uff0c\u4ee5\u53ca\u300c\u7126\u70b9\u5728\u54ea\u51b3\u5b9a\u8c01\u80fd\u6536\u5230\u6309\u952e\u300d |\n| \u4e0e IDEA \u7684\u6709\u610f\u5dee\u5f02 | \u54ea\u4e9b\u5730\u65b9\u523b\u610f\u4e0d\u7167\u6284 |\n| \u6743\u9650 | 6 \u9879\u6743\u9650\u5404\u81ea\u4e3a\u4ec0\u4e48\u9700\u8981 |\n| \u5de5\u7a0b\u7ed3\u6784 | \u6e90\u7801\u5e03\u5c40\u3001\u4e3a\u4ec0\u4e48\u5fc5\u987b\u6784\u5efa\u3001\u751f\u6210\u7269\u4e3a\u4ec0\u4e48\u4e0d\u80fd\u624b\u6539 |\n| \u5f15\u64ce\u8bbe\u8ba1 | \u89c6\u56fe\u5982\u4f55\u4e0e Git \u901a\u4fe1\u3001\u73af\u5883\u8865\u9f50\u3001\u72b6\u6001\u4e0e\u8865\u4e01\u7684\u5173\u952e\u53d6\u820d |\n| \u4e00\u4e2a\u9879\u76ee\u91cc\u7684\u591a\u4e2a\u4ed3\u5e93 | \u5b50\u6a21\u5757\u4e0e\u5d4c\u5957\u4ed3\u5e93\u7684\u8bc6\u522b\u3001Root \u9009\u62e9\u5668\u4e0e\u5176\u8fb9\u754c |\n| \u8fdc\u7aef\u540c\u6b65 | \u63a8\u9001\u88ab\u62d2\u3001\u5206\u53c9\u3001\u51b2\u7a81\u3001\u4ee5\u53ca\u672a\u5b8c\u6210\u5408\u5e76\u7684\u51fa\u8def |\n| \u8ba4\u8bc1 | \u4e3a\u4ec0\u4e48\u63d2\u4ef6\u4e0d\u9700\u8981\u51ed\u636e\uff0c\u4ee5\u53ca\u552f\u4e00\u505a\u4e0d\u5230\u7684\u4e8b |\n| \u751f\u6210\u63d0\u4ea4\u4fe1\u606f | \u7528\u5bbf\u4e3b\u6a21\u578b\u8d77\u8349\uff0c\u8bed\u8a00/\u683c\u5f0f/\u8303\u56f4\u5982\u4f55\u5904\u7406 |\n| \u914d\u8272 | \u54ea\u4e9b\u53d6\u81ea JetBrains \u6587\u6863\uff0c\u54ea\u4e9b\u662f\u523b\u610f\u7684\u504f\u79bb |\n| \u6d4b\u8bd5\u4e0e\u5de5\u5177 | harness / smoke / drive / \u51b3\u7b56\u7b14\u8bb0\u95e8\u7981 |\n| \u5f00\u53d1\u4e0e\u6253\u5305 | \u52a0\u8f7d\u672c\u5730\u63d2\u4ef6\u3001\u6784\u5efa\u3001\u6253\u5305\u542b\u6743\u9650\u6269\u5f20\u7684\u5751 |\n| \u5df2\u77e5\u7f3a\u53e3 | \u8bda\u5b9e\u6e05\u5355\uff1a\u54ea\u4e9b\u63a7\u4ef6\u65e0\u6548\u3001\u54ea\u4e9b\u80fd\u529b\u53d7\u9650 |\n| \u8bb0\u5fc6\u4e0e\u51b3\u7b56\u7b14\u8bb0 | `.memories/`\u3001`.agents/notes/` \u4e0e\u53cd\u5411\u7d22\u5f15 |\n\n## \u754c\u9762\u4e0e\u529f\u80fd\n\n\u5de5\u4f5c\u9762\u677f\u91cc\u6709\u4e24\u4e2a docked \u89c6\u56fe\uff0c\u5bf9\u5e94 IDEA \u7684\u4e24\u4e2a\u5de5\u5177\u7a97\u53e3\uff1a\n\n| \u9762\u677f | \u5bf9\u5e94 IDEA | \u5185\u5bb9 |\n| --- | --- | --- |\n| **\u63d0\u4ea4**\uff08`views/commit.html`\uff09 | Commit \u5de5\u5177\u7a97\u53e3\uff0c`Alt+0` | Changes \u533a\uff08Staged / Unstaged / Unversioned Files / Merge Conflicts\uff09\u3001\u9009\u4e2d\u6587\u4ef6\u7684 diff\u3001\u5e26\u5386\u53f2\u7684\u63d0\u4ea4\u4fe1\u606f\u6846\u3001Amend\u3001Sign-off\u3001Commit\u3001Commit and Push |\n| **Git**\uff08`views/git.html`\uff09 | Git \u5de5\u5177\u7a97\u53e3\uff0c`Alt+9` | **Log** \u9875\u7b7e\uff08\u5206\u652f\u9762\u677f\u3001\u5e26\u56fe\u5f62\u4e0e\u5f15\u7528\u5fbd\u6807\u7684\u63d0\u4ea4\u5217\u8868\u3001changed files\u3001commit details\uff09\u4e0e **Console** \u9875\u7b7e |\n\n> `Alt+0` / `Alt+9` \u662f IDEA \u81ea\u5df1\u7684\u7ed1\u5b9a\uff0c\u63d2\u4ef6**\u6ca1\u6709**\u6ce8\u518c\u70ed\u952e\uff08`manifest.json` \u91cc\u6ca1\u6709\n> `keybindings` \u6bb5\uff09\uff1b\u8fd9\u91cc\u53ea\u662f\u544a\u8bc9\u4f60\u5b83\u4eec\u5728 IDEA \u91cc\u5bf9\u5e94\u4ec0\u4e48\u3002\n\n\u547d\u4ee4\u9762\u677f\u91cc\u53e6\u6709\u4e24\u6761\u547d\u4ee4\uff1a`IDEA Git: Open as a separate window`\uff08\u628a\u4e24\u4e2a\u7a97\u53e3\u5e76\u5230\u4e00\u4e2a\u6807\u7b7e\u680f\u91cc\uff0c\n\u5bbd\u5c4f\u7528\uff0c\u52a0\u8f7d `renderer/index.html`\uff09\u4e0e `IDEA Git: Refresh repository`\u3002\u63d2\u4ef6\u5728\u542f\u52a8\u65f6\u6fc0\u6d3b\n\uff08`activationEvents: onStartup`\uff09\u3002\n\n### \u529f\u80fd\u5bf9\u7167\u8868\uff08\u7528 IDEA \u81ea\u5df1\u7684\u8bf4\u6cd5\uff09\n\n| \u529f\u80fd | \u4f4d\u7f6e | \u8bf4\u660e |\n| --- | --- | --- |\n| `Staged` / `Unstaged` / `Unversioned Files` / `Merge Conflicts` | \u63d0\u4ea4 \u2192 Changes \u533a | \u6309**\u76ee\u5f55\u6811**\u5206\u7ec4\uff0c\u6bcf\u4e2a\u6587\u4ef6\u843d\u5728\u5b83\u6240\u5c5e\u7684\u6587\u4ef6\u5939\u4e0b\u3002\u6587\u4ef6\u5939\u7684\u52fe\u9009\u662f\u7ea7\u8054\u7684\uff1a\u52fe\u4e0a\u4f1a\u628a\u5176\u4e0b\u6240\u6709\u6587\u4ef6\uff08\u542b\u66f4\u6df1\u5c42\u76ee\u5f55\uff09\u52a0\u5165\u7d22\u5f15\uff0c\u53d6\u6d88\u5219\u6574\u68f5\u5b50\u6811\u79fb\u51fa\u7d22\u5f15\u3002\u540c\u65f6\u6709\u5df2\u6682\u5b58\u4e0e\u672a\u6682\u5b58\u6539\u52a8\u7684\u6587\u4ef6\u4f1a**\u540c\u65f6\u51fa\u73b0\u5728\u4e24\u7ec4\u91cc**\u2014\u2014Git \u81ea\u5df1\u5c31\u662f\u8fd9\u4e48\u62a5\u7684 |\n| \u89c6\u56fe\u9009\u9879\uff08\u9f7f\u8f6e\uff09 | \u63d0\u4ea4 \u2192 Changes \u5934\u90e8 | `Group by Directory`\uff08\u76ee\u5f55\u6811\uff09\u4e0e\u5e73\u94fa\u6a21\u5f0f\u5207\u6362\uff08\u5173\u6389\u5b83\u5c31\u662f\u5e73\u94fa\uff09\u3001`Compact Middle Directories`\uff08`src/views/app` \u5408\u6210\u4e00\u884c\uff09\u3001`Collapse All`\u3001\u4ee5\u53ca\u300c\u5168\u90e8\u52a0\u5165\u7d22\u5f15 / \u5168\u90e8\u79fb\u51fa\u7d22\u5f15\u300d\u4e24\u4e2a\u52a8\u4f5c\u3002\u4e24\u4e2a\u89c6\u56fe\u9009\u9879\u90fd\u4f1a\u6301\u4e45\u5316 |\n| \u8fc7\u6ee4\u53d8\u66f4 | \u63d0\u4ea4 \u2192 Changes \u5934\u90e8 | \u628a\u6811\u6536\u7a84\u5230\u5339\u914d\u7684\u6587\u4ef6\u3001\u5e76\u4fdd\u7559\u5176\u7956\u5148\u76ee\u5f55\uff1b\u5206\u7ec4\u6807\u9898\u663e\u793a `matched/total`\u3002`Esc` \u6e05\u7a7a |\n| `Commit Message` + \u63d0\u4ea4\u4fe1\u606f\u5386\u53f2 | \u63d0\u4ea4 \u2192 \u5e95\u90e8 | \u65f6\u949f\u6309\u94ae\u56de\u653e\u4e4b\u524d\u5199\u8fc7\u7684\u4fe1\u606f\uff0c\u6700\u65b0\u5728\u524d\uff0c\u8de8\u91cd\u542f\u4fdd\u7559\uff08\u672c\u5730\u65e0\u5386\u53f2\u65f6\u7ed9\u63d0\u793a\uff0c\u83dc\u5355\u5e95\u90e8\u6709 `Clear All`\uff09 |\n| `Generate Commit Message` | \u63d0\u4ea4 \u2192 \u5e95\u90e8 | \u7528**\u5bbf\u4e3b\u81ea\u5df1\u7684\u6a21\u578b**\u8d77\u8349\u4fe1\u606f\u3002\u63cf\u8ff0\u5f53\u524d\u9009\u4e2d\u7684\u6587\u4ef6\uff1b\u6ca1\u9009\u6587\u4ef6\u65f6\u63cf\u8ff0\u6240\u6709\u5df2\u6682\u5b58\u5185\u5bb9\uff1b\u7bad\u5934\u83dc\u5355\u7528\u6765\u6311\u6a21\u578b |\n| `Amend`\u3001`Sign-off commit` | \u63d0\u4ea4 \u2192 \u5e95\u90e8 | `--amend`\u3001`--signoff` |\n| `Commit`\u3001`Commit and Push` | \u63d0\u4ea4 \u2192 \u5e95\u90e8 | \u62c6\u5206\u6309\u94ae\uff1b\u4e0b\u62c9\u91cc\u8fd8\u6709 Amend / Sign-off / \u56de\u6eda\uff08\u628a\u5df2\u6682\u5b58\u5185\u5bb9\u5168\u90e8\u79fb\u51fa\u7d22\u5f15\uff09 |\n| \u6bcf\u4e2a\u4ee3\u7801\u5757\u7684 `Include into commit` | \u63d0\u4ea4 \u2192 diff \u9762\u677f | **\u5c40\u90e8\u63d0\u4ea4**\u3002\u6bcf\u4e2a hunk \u5e26\u4e00\u4e2a\u52fe\u9009\u6846\uff1b\u5207\u6362\u5b83\u65f6\u7528\u91cd\u5efa\u51fa\u6765\u7684\u8865\u4e01\u8dd1 `git apply --cached`\uff08\u6216 `-R`\uff09\uff0c\u4e8e\u662f\u53ea\u6709\u88ab\u9009\u4e2d\u7684 hunk \u8fdb\u5165\u8fd9\u6b21\u63d0\u4ea4 |\n| `Stage Hunk` / `Discard Hunk` / `Unstage Hunk` | \u63d0\u4ea4 \u2192 diff \u9762\u677f | \u9f20\u6807\u60ac\u505c\u5230\u5de5\u4f5c\u533a diff \u7684 hunk \u5934\u65f6\u51fa\u73b0\uff1b\u5df2\u6682\u5b58 diff \u4e0a\u5219\u662f\u53cd\u5411\u7684 `Unstage Hunk` |\n| hunk \u5934\u4e0a\u7684\u9644\u6ce8 | \u63d0\u4ea4 \u2192 diff \u9762\u677f | \u7eaf\u7a7a\u767d hunk \u6807 `\u00b7 whitespace only`\uff1b\u5b50\u6a21\u5757\u6307\u9488\u53d8\u5316\u6807 `\u00b7 submodule abc1234 \u2192 def5678` |\n| `Show Diff`\u3001`Rollback`\u3001`Add`/`Remove from index`\u3001`Open File`\u3001`Reveal in File Manager`\u3001`Copy Hash` | \u63d0\u4ea4 \u2192 \u6587\u4ef6\u53f3\u952e\u83dc\u5355 | `Rollback` \u4f1a\u5148\u786e\u8ba4\uff1b\u5b83\u4f1a\u5220\u9664\u672a\u8ddf\u8e2a\u6587\u4ef6\u3001\u8fd8\u539f\u5df2\u8ddf\u8e2a\u6587\u4ef6 |\n | \u5206\u652f\u63a7\u4ef6\uff08`main \u21912 \u21931`\uff09 | \u4e24\u4e2a\u5de5\u5177\u680f | \u5206\u652f\u540d\u3001\u9886\u5148/\u843d\u540e\uff0c\u70b9\u5f00\u662f\u672c\u5730/\u8fdc\u7aef\u5206\u652f\u5217\u8868\uff0c\u70b9\u4e00\u884c\u5373 checkout\uff1b`New Branch`\u3001`Merge into Current\u2026`\u3001`Rebase Current onto\u2026`\u3001`Rename`\u3001`Set/Unset Upstream`\u3001`Delete\u2026`\u3001`Fetch`\u3001`Pull`\u3001`Push`\u3001`Force Push (with lease)`\u3001`Stash Changes` \u4e0e\u50a8\u85cf\u5217\u8868\uff08Apply/Pop/Drop\uff09\u3002\uff08\u5206\u652f\u7684**\u5b8c\u6574\u53f3\u952e\u52a8\u4f5c\u83dc\u5355\u5728 Git \u89c6\u56fe\u7684 `Branches` \u9762\u677f**\u91cc\uff0c\u5de5\u5177\u680f\u5f39\u5c42\u662f\u5e38\u7528\u5b50\u96c6\uff09 |\n| \u4ed3\u5e93\u63a7\u4ef6\uff08`mod \u00b7 submodule`\uff09 | \u4e24\u4e2a\u5de5\u5177\u680f | \u5217\u51fa\u5de5\u4f5c\u533a\u4ed3\u5e93\u4ee5\u53ca\u5d4c\u5957\u5728\u5b83\u91cc\u9762\u7684\u6bcf\u4e00\u4e2a\u4ed3\u5e93\u2014\u2014\u5b50\u6a21\u5757\u3001\u4ee5\u53ca\u6070\u597d\u4f4f\u5728\u8fd9\u91cc\u7684\u514b\u9686\u2014\u2014\u9009\u4e2d\u5b83\u5c31\u628a\u6574\u4e2a\u5de5\u5177\u7a97\u53e3\u5bf9\u51c6\u90a3\u4e2a\u4ed3\u5e93\u3002\u53ea\u6709\u4e00\u4e2a\u4ed3\u5e93\u65f6\uff08\u5355\u4ed3\u5e93\u9879\u76ee\uff09\u9690\u85cf |\n| `Log`\u3001`Console` | Git \u2192 \u9875\u7b7e | Console \u663e\u793a\u63d2\u4ef6\u8dd1\u8fc7\u7684\u547d\u4ee4\u4e0e\u8f93\u51fa\uff0c\u5931\u8d25\u6807\u7ea2\uff0c\u53ef `Clear All`\uff08\u89c1\u4e0b\u65b9\u300c\u5df2\u77e5\u7f3a\u53e3\u300d\uff1a\u63a2\u6d4b\u578b\u547d\u4ee4\u6210\u529f\u65f6\u4e0d\u8bb0\u5f55\uff09 |\n| \u63d0\u4ea4\u56fe | Git \u2192 Log | \u6cf3\u9053\u7531\u7236\u63d0\u4ea4\u4fe1\u606f\u7b97\u51fa\uff1b\u5206\u652f\u5c16\u7aef\u9ec4\u8272\u3001\u672c\u5730\u5206\u652f\u7eff\u8272\u3001\u8fdc\u7aef\u7d2b\u8272\u3001\u6807\u7b7e\u7070\u8272\u3002\u81ea\u5df1\u7684\u63d0\u4ea4 subject \u52a0\u7c97\uff0c\u5f53\u524d\u5206\u652f\u7684\u884c\u6709\u5e95\u8272 |\n | `Branches` \u9762\u677f | Git \u2192 Log \u2192 \u5de6\u4fa7 | `HEAD`\uff08\u70b9\u4e00\u70b9\u56de\u5230\u5f53\u524d\u63d0\u4ea4\uff09\uff0f`Local branches`\uff0f`Remote branches`\uff08`feature/*` \u8fd9\u7c7b\u6309 `/` \u6298\u6210\u53ef\u5c55\u5f00\u7684\u6587\u4ef6\u5939\uff1b\u70b9\u8fdc\u7aef\u5206\u652f\u4f1a\u81ea\u52a8\u5efa\u672c\u5730\u8ddf\u8e2a\u5206\u652f\uff0c\u4e0d\u518d\u662f detached HEAD\uff09\uff0f`Tags`\uff08\u70b9\u4e00\u70b9\u6309\u8be5\u6807\u7b7e\u8fc7\u6ee4\u65e5\u5fd7\uff09\uff0f`Remotes`\uff08Fetch / Fetch+Prune / \u590d\u5236\u5730\u5740\uff09\uff0f`Stashes`\uff08Show / Apply / Pop / Drop\uff09\u3002\u5206\u652f\u53f3\u952e\uff1a`Checkout`\u3001`New Branch from Here`\u3001`Merge into Current`\u3001`Rebase Current onto Selected`\u3001`Rename`\u3001`Set/Unset Upstream`\u3001`Delete`\uff08\u672a\u5b8c\u5168\u5408\u5e76\u8d70\u4e8c\u6b21\u786e\u8ba4\uff09\u3001`Copy Branch Name`\u3001`Push`\u3001`Fetch` |\n| `Changed Files`\u3001`Commit Details` | Git \u2192 Log \u2192 \u5217\u8868\u4e0b\u65b9 | Details \u663e\u793a\u54c8\u5e0c\u3001\u4f5c\u8005\u3001\u65e5\u671f\u3001subject \u4e0e\u5b8c\u6574\u6b63\u6587 |\n| `Graph Options` | Git \u2192 \u5de5\u5177\u680f | `By commit date` / `Topologically`\u3001`Show First Parent`\u3001`No Merges`\u3001`Show Graph`\u3001\u5404\u9762\u677f\u5f00\u5173 |\n | \u8fc7\u6ee4 | Git \u2192 \u5de5\u5177\u680f | \u6587\u672c\u641c\u7d22\uff08\u672c\u5730 substring\uff09\u3001\u5206\u652f\u8fc7\u6ee4\u3001\u7528\u6237\u8fc7\u6ee4\uff08\u5168\u90e8\uff0f\u53ea\u770b\u6211\u7684\uff09\u3001\u65e5\u671f\u8fc7\u6ee4\uff08\u5168\u90e8\uff0f24 \u5c0f\u65f6\uff0f\u4e00\u5468\uff0f\u4e00\u6708\uff09\u3001\u8def\u5f84\u8fc7\u6ee4\uff08\u670d\u52a1\u7aef `git log -- `\uff0c\u8f93\u5165\u9632\u6296 450ms\u3001\u56de\u8f66\u7acb\u5373\u5237\uff09 |\n | \u63d0\u4ea4\u52a8\u4f5c | Git \u2192 Log \u2192 \u53f3\u952e\u63d0\u4ea4 | `Show Diff`\u3001`Copy Revision Number`\u3001`Copy Message`\u3001`Compare with HEAD`\u3001`Checkout Revision`\u3001`New Branch from Here`\u3001`New Tag`\u3001`Cherry-Pick`\u3001`Revert`\u3001`Reset Current Branch to Here`\uff08soft/mixed/hard\uff09\u3001`Edit Commit Message`\uff08\u4ec5 HEAD\uff09 |\n| `Side-by-side viewer` / `Unified viewer` | diff \u9762\u677f\u5934\u90e8 | \u4e24\u8005\u6e32\u67d3\u540c\u4e00\u4efd\u89e3\u6790\u597d\u7684 hunk |\n| `Ignore Differences` \u2192 `None` / `Ignore whitespaces` | diff \u9762\u677f\u9f7f\u8f6e | \u7531 Git \u81ea\u5df1\u5b9e\u73b0\uff08`git diff -w`\uff09\uff0c\u4e0d\u662f\u628a\u884c\u85cf\u8d77\u6765\u3002\u5f00\u7740\u5b83\u65f6**\u7981\u7528 hunk \u6682\u5b58**\uff0c\u56e0\u4e3a\u5ffd\u7565\u7a7a\u767d\u7684 diff \u4e0d\u662f\u5408\u6cd5\u8865\u4e01 |\n| `Show Whitespaces` | diff \u9762\u677f\u773c\u775b\u56fe\u6807 | \u7a7a\u683c\u6e32\u67d3\u6210 `\u00b7`\uff0c\u5236\u8868\u7b26\u6e32\u67d3\u6210 `\u2192` |\n| `Show Line Numbers` | diff \u9762\u677f\u9f7f\u8f6e / commit diff \u6d6e\u5c42\u5934\u90e8 | \u884c\u53f7\u680f\u3002\u63d0\u4ea4\u89c6\u56fe\u9ed8\u8ba4**\u5173**\u3001\u4e14\u8fd9\u4e2a\u5f00\u5173\u4f1a\u88ab\u8bb0\u4f4f\uff1bcommit diff \u6d6e\u5c42\u9ed8\u8ba4**\u5f00**\uff0c\u4f46\u6bcf\u6b21\u6253\u5f00\u90fd\u56de\u5230\u9ed8\u8ba4\uff08\u6d6e\u5c42\u4e0d\u6301\u4e45\u5316\uff09 |\n| `Collapse Unchanged Fragments` | diff \u9762\u677f | \u957f\u7684\u4e0a\u4e0b\u6587\u4f1a\u6298\u53e0\u6210\u4e00\u884c\u53ef\u70b9\u51fb\u7684\u6761\uff08`\u22ee N \u884c\u672a\u4fee\u6539`\uff09\u3002\u53ea\u5728**\u7edf\u4e00\u89c6\u56fe**\u91cc\u6298\u53e0\uff0c\u5e76\u6392\u89c6\u56fe\u4e0d\u6298 |\n| \u9ad8\u4eae\u5dee\u5f02 | diff \u9762\u677f | **\u8bcd\u7ea7**\uff1a\u884c\u4e2d\u95f4\u53d8\u5316\u7684\u90e8\u5206\u88ab\u6807\u51fa\u6765\uff0c\u4e8e\u662f `1.0.0` \u2192 `1.1.0` \u53ea\u6807\u51fa\u90a3\u4e00\u4e2a\u4e0d\u540c\u7684\u5b57\u7b26 |\n| \u63d0\u4ea4\u533a\u72b6\u6001\u884c | \u63d0\u4ea4 \u2192 \u63d0\u4ea4\u6309\u94ae\u4e0a\u65b9 | \u4e09\u79cd\u72b6\u6001\uff1a\u8fdb\u884c\u4e2d\u7684\u64cd\u4f5c\uff08\u5e26 `Continue`/`Abort`\uff09\u3001\u51b2\u7a81\u63d0\u793a\u3001`Nothing is staged` \u8b66\u544a\uff0c\u5e38\u89c4\u65f6\u663e\u793a\u300c\u5c06\u63d0\u4ea4 N / M \u4e2a\u6587\u4ef6\u300d |\n| Console \u7ec6\u8282 | Git \u2192 Console | \u6bcf\u6761\u547d\u4ee4\u5e26 `[hh:mm:ss]` \u65f6\u95f4\u6233\u3001\u53f3\u4e0a\u89d2\u663e\u793a\u6761\u6570\u3001\u72ec\u7acb\u7684 Refresh\u3001\u7a7a\u6001\u63d0\u793a |\n| \u5de5\u5177\u680f\u53f3\u4fa7 | \u4e24\u4e2a\u5de5\u5177\u680f | \u5f53\u524d\u4ed3\u5e93/\u5de5\u4f5c\u533a\u76ee\u5f55\u540d |\n\n`Ctrl+F5` \u7684\u884c\u4e3a\u2014\u2014\u300c\u6bcf\u4e2a\u52a8\u4f5c\u4e4b\u540e\u90fd\u5237\u65b0\u300d\u2014\u2014\u662f\u5185\u5efa\u7684\uff1a\u4efb\u4f55\u5199\u5165\u52a8\u4f5c\u4e4b\u540e\u90fd\u4f1a\u5237\u65b0\u72b6\u6001\u3001diff \u4e0e\u5217\u8868\u3002\n\n## \u5feb\u6377\u952e\n\n\u5bbf\u4e3b\u5728\u4e3b\u7a97\u53e3\u6e32\u67d3\u5c42\u8dd1\u5e94\u7528\u81ea\u5df1\u7684\u5feb\u6377\u952e\uff0c\u800c\u63d2\u4ef6\u89c6\u56fe\u662f\u72ec\u7acb\u7684 `WebContentsView`\u2014\u2014\u6240\u4ee5**\u7126\u70b9\u5728\u89c6\u56fe\u91cc\u65f6\uff0c\u5bbf\u4e3b\u6536\u4e0d\u5230\u6309\u952e**\u3002\n\u7ed3\u8bba\uff1a**\u51e1\u662f\u6309\u94ae\u5e7f\u544a\u51fa\u6765\u7684\u952e\uff0c\u90fd\u5fc5\u987b\u5728\u9875\u5185\u81ea\u5df1\u7ed1\u5b9a**\uff0c\u4e0b\u9762\u8fd9\u4e9b\u5c31\u662f\uff1a\n\n| \u52a8\u4f5c | macOS | Windows / Linux |\n| --- | --- | --- |\n| \u5237\u65b0 | `\u2318R` | `Ctrl+R` |\n| \u5237\u65b0\uff08IDEA \u7684\u7ed1\u5b9a\uff09 | `\u2303F5` | `Ctrl+F5` |\n| \u52a0\u5165\u7d22\u5f15 | `\u2318\u2325A` | `Ctrl+Alt+A` |\n| \u56de\u6eda\uff08\u5148\u786e\u8ba4\uff09 | `\u2318\u2325Z` | `Ctrl+Alt+Z` |\n| Show Diff | `\u2318D` | `Ctrl+D` |\n| \u63d0\u4ea4\u4fe1\u606f\uff08\u63d0\u4ea4\u89c6\u56fe\uff09 | `\u2318K` | `Ctrl+K` |\n| \u641c\u7d22\u65e5\u5fd7\uff08Git \u89c6\u56fe\uff09 | `\u2318F` | `Ctrl+F` |\n| \u5173\u95ed\u5bf9\u8bdd\u6846 / \u83dc\u5355 / diff | `Esc` | `Esc` |\n| \u5728\u63d0\u4ea4\u5217\u8868\u4e2d\u79fb\u52a8 | `\u2191` `\u2193` | `\u2191` `\u2193` |\n\n\u63d0\u793a\u6587\u6848\u7531\u7ed1\u5b9a\u7684\u540c\u4e00\u4efd\u89c4\u683c\u751f\u6210\uff08`PIG.formatShortcut`\uff09\uff0c\u6240\u4ee5**\u4e0d\u53ef\u80fd\u51fa\u73b0\u300c\u5199\u4e86\u5374\u6309\u4e0d\u51fa\u300d\u7684\u63d0\u793a\u952e**\u2014\u2014\n\u8fd9\u662f\u4e2a\u503c\u5f97\u5728\u8bbe\u8ba1\u4e0a\u6392\u9664\u7684\u9519\u8bef\uff0c\u56e0\u4e3a\u5b83\u76f4\u5230\u6709\u4eba\u53bb\u6309\u624d\u4f1a\u66b4\u9732\u3002\n\n\u4ee3\u7801\u91cc\u8fd8\u7ed1\u4e86\uff1a\u63d0\u4ea4\u884c\u4e0a `Enter` / `Space` \u9009\u4e2d\u8be5\u63d0\u4ea4\uff1b\u5bf9\u8bdd\u6846\u91cc `Enter` \u786e\u8ba4\uff1b\u5f39\u51fa\u83dc\u5355\u6253\u5f00\u65f6\u81ea\u52a8\u805a\u7126\u7b2c\u4e00\u4e2a\u53ef\u9009\u9879\uff1b\n`\u2318\u21e7P` \u4f1a\u5f39\u4e00\u53e5\u63d0\u793a\uff08\u89c1\u4e0b\uff09\u3002\n\n### \u54ea\u4e2a\u952e\u5728\u54ea\u91cc\u6709\u6548\n\n\u5bbf\u4e3b\u7684\u52a0\u901f\u952e\u4e0e\u63d2\u4ef6\u7684\u7ed1\u5b9a\u4f4f\u5728\u4e0d\u540c\u5730\u65b9\uff0c\u6240\u4ee5\u300c\u540c\u4e00\u4e2a\u952e\u5e72\u4ec0\u4e48\u300d\u53d6\u51b3\u4e8e\u7126\u70b9\u5728\u54ea\u3002\u503c\u5f97\u7cbe\u786e\u77e5\u9053\uff1a\n\n| \u6309\u952e | \u5e94\u7528\u5185\uff08\u7126\u70b9\u4e0d\u5728\u89c6\u56fe\u91cc\uff09 | \u672c\u63d2\u4ef6\u89c6\u56fe\u5185 |\n| --- | --- | --- |\n| `\u2318K` / `Ctrl+K` | \u5e94\u7528\u7684**\u4f1a\u8bdd\u641c\u7d22** | **\u63d0\u4ea4\u89c6\u56fe**\uff1a\u805a\u7126\u63d0\u4ea4\u4fe1\u606f\u6846\u3002**Git \u89c6\u56fe**\uff1a\u65e0\uff08\u5e94\u7528\u7684\u641c\u7d22\u5728\u8fd9\u91cc\u591f\u4e0d\u5230\uff09 |\n| `\u2318\u21e7P` / `Ctrl+Shift+P` | \u5e94\u7528\u7684**\u547d\u4ee4\u9762\u677f** | \u6ca1\u7528\u2014\u2014\u6309\u952e\u5230\u4e0d\u4e86\u5e94\u7528\uff0c\u6240\u4ee5\u89c6\u56fe\u4f1a\u660e\u786e\u544a\u8bc9\u4f60\u8be5\u53bb\u54ea\uff08`Alt+Space`\uff09 |\n| `Alt+Space` | \u63d2\u4ef6\u542f\u52a8\u5668 | **\u4e00\u6837\u53ef\u7528\u2014\u2014\u5b83\u662f\u771f\u6b63\u7684\u5168\u5c40\u5feb\u6377\u952e** |\n| `\u2318R` / `Ctrl+R` | \u91cd\u65b0\u52a0\u8f7d | \u5237\u65b0\u4ed3\u5e93 |\n| `\u2318D`\u3001`\u2318\u2325A`\u3001`\u2318\u2325Z`\u3001`\u2318F`\u3001`Esc`\u3001`\u2191` `\u2193` | \u5e94\u7528\u81ea\u5df1\u7684\u542b\u4e49 | \u63d2\u4ef6\u7684\u542b\u4e49\uff0c\u89c1\u4e0a\u8868 |\n\n\u6240\u4ee5\uff1a**\u8981\u8dd1\u5e94\u7528\u7ea7\u547d\u4ee4\uff08\u5305\u62ec `IDEA Git: Open as a separate window`\uff09\uff0c\u6309 `Alt+Space`\uff0c\u6216\u8005\u70b9\u56de\u5e94\u7528\u91cc\u7528 `\u2318\u21e7P`\u3002**\n\u73b0\u5728\u5728\u89c6\u56fe\u91cc\u6309 `\u2318\u21e7P` \u4f1a\u5f39\u4e00\u53e5\u8bf4\u660e\uff0c\u800c\u4e0d\u662f\u6beb\u65e0\u53cd\u5e94\u3002\n\n## \u4e0e IDEA \u7684\u6709\u610f\u5dee\u5f02\n\n- **\u6ca1\u6709\u7f16\u8f91\u5668\u3002** IDEA \u628a diff \u5f00\u5728\u7f16\u8f91\u5668\u6807\u7b7e\u9875\u91cc\uff1b\u8fd9\u91cc\u63d0\u4ea4\u7684 diff \u5f00\u5728 Git \u5de5\u5177\u7a97\u53e3\u5185\u7684\u6d6e\u5c42\u91cc\u3002\n `Jump to Source` \u6362\u6210\u4e86 `Open File`\uff08\u4ea4\u7ed9\u7cfb\u7edf\u9ed8\u8ba4\u7a0b\u5e8f\u6253\u5f00\uff09\u4e0e `Reveal in File Manager`\u3002\n- **\u6ca1\u6709 changelist\u3002** IDEA \u7684 changelist \u662f IDE \u4fa7\u6982\u5ff5\uff0cGit \u91cc\u6ca1\u6709\u5bf9\u5e94\u7269\uff1bStaged/Unstaged \u7684\u5206\u7ec4\u53d6\u4ee3\u4e86\u5b83\u3002\n \u4e00\u4efd\u5de5\u4f5c\u526f\u672c\uff0c\u4e00\u4efd\u53d8\u66f4\u96c6\u3002\n- **\u6ca1\u6709 shelf\u3002** `Stash` \u8986\u76d6 Git \u539f\u751f\u7684\u90a3\u90e8\u5206\u573a\u666f\u3002\n- **\u5e76\u6392\u89c6\u56fe\u4e0d\u8054\u52a8\u6eda\u52a8\u3002** \u5de6\u53f3\u4e24\u680f\u4f5c\u4e3a\u4e00\u4e2a\u7f51\u683c\u4e00\u8d77\u6a2a\u5411\u6eda\u52a8\uff0c\u4e8e\u662f\u4e24\u680f\u6c38\u8fdc\u5728\u540c\u4e00\u4e2a\u504f\u79fb\u4e0a\u3002\n- **`Edit Commit Message` \u53ea\u5bf9\u5c16\u7aef\u63d0\u4ea4\u5f00\u653e**\uff0c\u56e0\u4e3a\u6539\u5199\u66f4\u65e9\u7684\u63d0\u4ea4\u9700\u8981 rebase\u3002\n- **`Ignore whitespaces` \u6a21\u5f0f\u4e0b\u7981\u7528 hunk \u6682\u5b58**\uff0c\u672a\u8ddf\u8e2a\u6587\u4ef6\u4e5f\u7981\u7528\u2014\u2014\u5ffd\u7565\u7a7a\u767d\u7684 diff\u3001\u4ee5\u53ca\u5bf9\u7740 `/dev/null` \u7684 diff\uff0c\n \u90fd\u4e0d\u662f Git \u4f1a\u63a5\u53d7\u7684\u8865\u4e01\u3002\u6574\u6587\u4ef6\u7684 `Add` \u4ecd\u7136\u53ef\u7528\u3002\n- **\u5220\u9664\u884c\u662f\u7ea2\u8272\uff0c\u4e0d\u662f JetBrains \u7684\u7070\u8272**\uff0c\u6697\u8272 diff \u914d\u8272\u662f\u8c03\u51fa\u6765\u7684\u800c\u975e\u7167\u6284\u7684\u3002\u89c1\u300c\u914d\u8272\u300d\u3002\n\n## \u6743\u9650\n\n| \u6743\u9650 | \u4e3a\u4ec0\u4e48 |\n| --- | --- |\n| `ui.panel` | \u72ec\u7acb\u7a97\u53e3\uff08`renderer/index.html`\uff09 |\n| `ui.view` | \u4e24\u4e2a docked \u89c6\u56fe |\n| `clipboard.write` | `Copy Revision Number`\u3001`Copy Hash` \u8fd9\u7c7b\u590d\u5236\u52a8\u4f5c |\n| `fs.read` | \u5bf9\u53d8\u66f4\u6587\u4ef6\u6267\u884c `Open File` \u4e0e `Reveal in File Manager` |\n| `models.list` | \u751f\u6210\u6309\u94ae\u4e0a\u7684\u6a21\u578b\u9009\u62e9\u83dc\u5355 |\n| `agent.complete` | \u7528\u5bbf\u4e3b\u6a21\u578b\u8d77\u8349\u63d0\u4ea4\u4fe1\u606f |\n\n`PluginCheck` \u4f1a\u628a `clipboard.write` \u4e0e `fs.read` \u62a5\u6210 unused\uff0c\u56e0\u4e3a\u5b83\u53ea\u626b `main.js`\uff1b\u8fd9\u4e24\u4e2a\u90fd\u662f\u4ece\u89c6\u56fe\u7ecf\u9762\u677f\u6865\u8c03\u7684\n\uff08`clipboard.writeText` \u5728 `src/common.js`\uff0c`fs.openDefault` / `fs.reveal` \u5728 `src/commit-view.js`\uff09\uff0c\u5c5e\u8bef\u62a5\u3002\n\n`fs` \u7684\u8bfb\u53d6\u8303\u56f4\u58f0\u660e\u4e3a `{\"root\":\"workspace\",\"scope\":[\"**\"]}`\u2014\u2014\u53ea\u8bfb\u5de5\u4f5c\u533a\u3002\n\n**\u552f\u4e00\u4e00\u5904\u63d2\u4ef6\u5199\u5de5\u4f5c\u533a\u7684\u5730\u65b9**\u662f\u4e22\u5f03\u672a\u8ddf\u8e2a\u6587\u4ef6\uff08\u6216\u8fd8\u539f\u672a\u8ddf\u8e2a\u6587\u4ef6\u7684 hunk\uff09\uff1a\u5f15\u64ce\u76f4\u63a5 `fs.rmSync` \u5220\u6587\u4ef6\uff0c\n\u89c6\u56fe\u4fa7\u4f1a\u5148\u786e\u8ba4\u3002\u9664\u6b64\u4e4b\u5916\u4e0d\u78b0\u5de5\u4f5c\u533a\u7684\u6587\u4ef6\u2014\u2014\u6240\u6709\u53d8\u66f4\u90fd\u7ecf\u8fc7 `git`\u3002\n\uff08\u63d2\u4ef6\u53e6\u6709\u4e00\u5904\u5199\u76d8\uff0c\u5199\u7684\u662f\u5b83**\u81ea\u5df1**\u7684\u6570\u636e\u76ee\u5f55\uff1a`prefs.json`\uff0c\u5b58\u63d0\u4ea4\u4fe1\u606f\u5386\u53f2\u4e0e\u89c6\u56fe\u9009\u9879\uff0c\u4e0d\u843d\u5728\u4ed3\u5e93\u91cc\u3002\uff09\n\n## \u5de5\u7a0b\u7ed3\u6784\n\n```\nmain.js Node \u8fdb\u7a0b\uff1aGit \u5f15\u64ce + \u901a\u9053\u8def\u7531\uff08\u7ea6 2600 \u884c\uff09\nsrc/theme.css IDEA \u8c03\u8272\u677f\u4e0e\u7ec4\u4ef6\u6837\u5f0f \u2500\u2510\nsrc/layout.css \u5e03\u5c40\u4e0e\u54cd\u5e94\u5f0f \u2500\u2524\nsrc/common.js \u6865\u3001i18n\u3001\u56fe\u6807\u3001\u5f39\u51fa\u83dc\u5355 \u2500\u2524 tools/build.mjs\nsrc/diff.js \u7edf\u4e00 diff \u89e3\u6790\u4e0e\u6e32\u67d3 \u2500\u2524 \u5185\u8054\u8fdb\nsrc/commit-view.js \u63d0\u4ea4\u5de5\u5177\u7a97\u53e3 \u2500\u2524\nsrc/git-view.js Log + Console\uff0c\u4ee5\u53ca\u542f\u52a8 \u2500\u2518\nviews/commit.html \u751f\u6210\u7269\u2014\u2014\u4e0d\u8981\u624b\u6539\nviews/git.html \u751f\u6210\u7269\u2014\u2014\u4e0d\u8981\u624b\u6539\nrenderer/index.html \u751f\u6210\u7269\u2014\u2014\u4e24\u4e2a\u7a97\u53e3\u5e76\u5230\u4e00\u4e2a\u6807\u7b7e\u680f\ntools/build.mjs \u5185\u8054\u5668\ntools/harness.mjs \u5f15\u64ce\u56de\u5f52\uff08\u771f\u5b9e\u4ed3\u5e93\uff0c136 \u6761\u65ad\u8a00\uff09\ntools/drive.mjs \u4e0d\u5f00 GUI \u76f4\u63a5\u9a71\u52a8\u5f15\u64ce\ntools/smoke.mjs \u7528\u6869 bridge \u6e32\u67d3\u89c6\u56fe\u5230 .smoke/\ntools/notes.mjs \u51b3\u7b56\u7b14\u8bb0\u95e8\u7981\uff08+ tools/agent-notes/ \u7684 vendored \u6821\u9a8c\u5668\uff09\nmanifest.json \u6e05\u5355\uff1a\u89c6\u56fe\u3001\u547d\u4ee4\u3001\u6743\u9650\u3001engines\n```\n\n### \u4e3a\u4ec0\u4e48\u5fc5\u987b\u6709\u6784\u5efa\u6b65\u9aa4\n\n\u5bbf\u4e3b\u7528 `loadURL(pathToFileURL(entry))` \u52a0\u8f7d\u89c6\u56fe\uff0c\u4e5f\u5c31\u662f `file://` URL\uff0c\u800c **Chromium \u62d2\u7edd\u4ece `file://` \u52a0\u8f7d ES module**\n\uff08\u4e0d\u900f\u660e\u6e90\uff09\u3002\u5b98\u65b9\u81ea\u5e26\u63d2\u4ef6\u662f\u9760\u300c\u6bcf\u4e2a\u89c6\u56fe\u4e00\u4e2a\u5de8\u5927\u7684\u81ea\u5305\u542b HTML\u300d\u7ed5\u8fc7\u53bb\u7684\uff1b`tools/build.mjs` \u4ece\u53ef\u8bfb\u7684\u6e90\u7801\u4ea7\u51fa\u540c\u6837\u7684\u5f62\u72b6\uff1a\n\n```bash\nnode tools/build.mjs # \u5199\u51fa views/*.html \u4e0e renderer/index.html\n```\n\n\u6539 `src/`\uff0c\u8dd1\u6784\u5efa\uff0c\u6b63\u5728\u8fd0\u884c\u7684\u5f00\u53d1\u63d2\u4ef6\u4f1a\u70ed\u91cd\u8f7d\u3002\u76f4\u63a5\u6539\u751f\u6210\u51fa\u6765\u7684 HTML \u662f\u767d\u8d39\u529b\u6c14\u2014\u2014\u4e0b\u6b21\u6784\u5efa\u5c31\u8986\u76d6\u4e86\u3002\n\n> \u751f\u6210\u5668\u56fa\u5b9a\u5199 `lang=\"en\"`\uff08`tools/build.mjs`\uff09\uff0c\u4e0e\u754c\u9762\u8bed\u8a00\u65e0\u5173\u3002\u53ea\u5f71\u54cd\u65e0\u969c\u788d\u8bed\u4e49\u4e0e\u5b57\u4f53\u56de\u9000\uff0c\u4e0d\u5f71\u54cd\u663e\u793a\u3002\n\n## \u5f15\u64ce\u8bbe\u8ba1\n\n### \u89c6\u56fe\u600e\u4e48\u8ddf Git \u8bf4\u8bdd\n\n`main.js` \u8dd1\u5728\u4e13\u5c5e Node \u8fdb\u7a0b\u91cc\uff08Electron `utilityProcess`\uff09\uff0c\u6240\u4ee5\u5b83\u6709\u771f\u6b63\u7684 Node API\u3001\u80fd\u8d77 `git` \u8fdb\u7a0b\u3002\n\u89c6\u56fe\u662f\u6c99\u7bb1\u9875\u9762\uff0c\u53ea\u62ff\u5230 `window.pluginBridge`\u3002\u5bbf\u4e3b\u81ea\u5df1\u4e0d\u5b9e\u73b0\u7684\u901a\u9053**\u5168\u90e8**\u8f6c\u53d1\u7ed9\u63d2\u4ef6\u5bfc\u51fa\u7684 `onPanelInvoke`\u2014\u2014\n\u8fd9\u6b63\u662f\u81ea\u5b9a\u4e49\u901a\u9053\u80fd\u5de5\u4f5c\u7684\u539f\u56e0\uff1a\n\n```\n\u89c6\u56fe --pluginBridge.invoke(\"git/\u2026\")--> \u5bbf\u4e3b --> onPanelInvoke --> git\n```\n\n`onPanelInvoke` \u91cc\u4e00\u5171 **36 \u4e2a `git/*` \u901a\u9053**\uff1b\u4e0d\u8ba4\u8bc6\u7684\u901a\u9053\u4f1a\u660e\u786e\u56de `Unsupported channel`\uff0c\u800c\u4e0d\u662f\u9759\u9ed8\u4ec0\u4e48\u90fd\u4e0d\u505a\u3002\n\n### \u4e24\u4e2a\u73af\u5883\u4e8b\u5b9e\u51b3\u5b9a\u4e86\u5f15\u64ce\u7684\u5f62\u72b6\n\n- \u63d2\u4ef6\u8fdb\u7a0b\u53ea\u88ab\u4ea4\u7ed9 `PATH`\u3001`LANG` \u548c\u4e34\u65f6\u76ee\u5f55\u53d8\u91cf\uff0c**\u6ca1\u6709 `HOME`**\uff08Windows \u4e0a\u662f `USERPROFILE`\uff09\uff0c\n \u800c Git \u9700\u8981\u5b83\u6765\u8bfb `~/.gitconfig`\uff08\u8eab\u4efd\u3001\u51ed\u636e\u52a9\u624b\uff09\u3002\u6240\u4ee5\u6bcf\u6b21\u8c03\u7528\u90fd\u81ea\u5df1\u8865\u56de\u53bb\u3002**\u8fd9\u662f\u300c\u96f6\u914d\u7f6e\u8ba4\u8bc1\u300d\u7684\u5b9e\u73b0\u57fa\u7840\u3002**\n- \u6ca1\u6709\u7ec8\u7aef\uff0c\u6240\u4ee5\u4ea4\u4e92\u5f0f\u63d0\u793a\u88ab\u5173\u6389\uff08`GIT_TERMINAL_PROMPT=0`\u3001`GIT_ASKPASS=echo`\u3001`GIT_EDITOR=true`\u2026\uff09\uff0c\n \u4e8e\u662f `push` / `pull` \u4f1a**\u5feb\u901f\u3001\u53ef\u89c1\u5730\u5931\u8d25**\uff0c\u800c\u4e0d\u662f\u5bf9\u7740\u4e00\u4e2a\u6ca1\u4eba\u80fd\u8f93\u5165\u7684\u5bc6\u7801\u6846\u6c38\u8fdc\u6302\u7740\u3002\n\n\u987a\u5e26\u8865\u4e0a\u7684\u8fd8\u6709 `GIT_OPTIONAL_LOCKS=0`\uff08\u8bfb\u64cd\u4f5c\u4e0d\u62ff\u7d22\u5f15\u9501\uff09\u3001`GIT_PAGER=cat`\u3001`GIT_CONFIG_NOSYSTEM` \u515c\u5e95\u3002\n`git` \u53ef\u6267\u884c\u6587\u4ef6\u5728 `PATH` \u4e0e\u4e00\u7ec4\u6807\u51c6\u5b89\u88c5\u8def\u5f84\u91cc\u627e\uff0c\u627e\u4e0d\u5230\u4f1a\u7ed9\u4e00\u6761\u660e\u786e\u7684\u9519\u8bef\uff0c\u800c\u4e0d\u662f\u8ba9\u6bcf\u4e2a\u52a8\u4f5c\u90fd\u83ab\u540d\u5931\u8d25\u3002\n\n### \u547d\u4ee4\u7684\u6267\u884c\u8fb9\u754c\n\n\u5355\u6761\u547d\u4ee4 **25 \u79d2**\u540e SIGKILL\u2014\u2014\u523b\u610f\u77ed\u4e8e\u5bbf\u4e3b\u7684 30 \u79d2\u9762\u677f\u8d85\u65f6\uff0c\u5426\u5219\u8d85\u65f6\u4f1a\u4ee5\u300c\u9762\u677f\u65e0\u54cd\u5e94\u300d\u7684\u5f62\u5f0f\u51fa\u73b0\uff0c\n\u800c\u770b\u4e0d\u5230 Git \u5230\u5e95\u5361\u5728\u54ea\u3002\u6bcf\u6761\u8f93\u51fa\u6d41\u4e0a\u9650 **8 MiB**\uff0c\u8d85\u51fa\u7684\u90e8\u5206\u662f\u5de8\u91cf\u65e5\u5fd7\uff0c\u4e0d\u662f\u4fe1\u606f\u3002\n\n### \u72b6\u6001\u662f\u600e\u4e48\u8bfb\u7684\n\n\u72b6\u6001\u7528 `git status --porcelain=v2 -z` \u8bfb\uff1a`-z` \u662f\u552f\u4e00\u80fd**\u539f\u6837**\u8fd4\u56de\u8def\u5f84\u7684\u5f62\u5f0f\uff0c\u6240\u4ee5\u7a7a\u683c\u4e0e\u975e ASCII \u6587\u4ef6\u540d\u80fd\u6d3b\u4e0b\u6765\uff1b\nv2 \u628a\u7d22\u5f15\u5217\u4e0e\u5de5\u4f5c\u533a\u5217\u5206\u5f00\uff0c\u800c\u8fd9\u4e24\u5217\u6b63\u597d\u5c31\u662f\u754c\u9762\u663e\u793a\u7684\u300c\u5df2\u6682\u5b58 / \u672a\u6682\u5b58\u300d\u3002\n\uff08\u53ea\u6709\u4e00\u5904\u4f8b\u5916\uff1a\u751f\u6210\u63d0\u4ea4\u4fe1\u606f\u65f6\u4e3a\u4e86\u907f\u514d\u91cd\u547d\u540d\u88ab\u91cd\u590d\u63cf\u8ff0\uff0c\u53e6\u8dd1\u4e86\u4e00\u6b21 v1 \u7684 `--porcelain`\u3002\uff09\n\n### diff \u4e0e\u8865\u4e01\n\ndiff \u7528 Git \u9ed8\u8ba4\u7684 `a/`-`b/` \u524d\u7f00\u4ea7\u51fa\uff0c\u56e0\u4e3a `git apply` \u4f1a\u5265\u6389\u4e00\u4e2a\u524d\u5bfc\u8def\u5f84\u5206\u91cf\u2014\u2014\n**\u7ed9 `git diff` \u52a0 `--no-prefix` \u4f1a\u8ba9 hunk \u8865\u4e01\u88ab\u62d2\u7edd**\uff0c\u8fd9\u662f\u672c\u4ed3\u5e93\u7684\u4e00\u6761\u786c\u6027\u7ea6\u5b9a\u3002\n\u56de\u4f20\u7ed9 Git \u7684\u8865\u4e01\u662f\u300c\u539f\u59cb\u5934\u90e8 + \u88ab\u9009\u4e2d\u7684 hunk\u300d\uff0c\u8fd9\u6b63\u662f `--recount` \u80fd\u63a5\u53d7\u90e8\u5206\u9009\u62e9\u7684\u539f\u56e0\u3002\n\n\u8865\u4e01\u8fd8\u5e26**\u6765\u6e90\u4ed3\u5e93\u6807\u8bc6**\uff1a`git/apply-patch` \u4f1a\u6821\u9a8c `root`\uff0c\u4e0d\u7b26\u5219\u56de `STALE_REPOSITORY`\u3002\n\u56e0\u4e3a `discard` \u4f1a\u5199\u5de5\u4f5c\u6811\uff0c\u4e00\u4e2a\u300c\u8bfb\u51fa\u6765\u3001\u8fc7\u4e00\u4f1a\u513f\u518d\u5199\u56de\u53bb\u300d\u7684\u901a\u9053\u5fc5\u987b\u80fd\u62d2\u7edd\u6765\u81ea\u5df2\u5207\u6362\u4ed3\u5e93\u7684\u65e7\u8865\u4e01\u3002\n\n### Console \u8bb0\u4ec0\u4e48\n\nConsole \u662f\u73af\u5f62\u7f13\u51b2\uff1a**\u6700\u591a 200 \u6761**\uff0c\u6bcf\u6761 stdout / stderr \u5404\u622a\u5230 **4000 \u5b57\u7b26**\u3002\n\u63a2\u6d4b\u578b\u547d\u4ee4\uff08`rev-parse`\u3001`ls-files`\u3001`for-each-ref`\u3001`config`\u3001`--version` \u7b49\uff09\u6210\u529f\u65f6**\u4e0d\u8bb0\u5f55**\u2014\u2014\n\u5b83\u4eec\u6bcf\u6b21\u5237\u65b0\u90fd\u8dd1\uff0c\u8bb0\u4e0b\u6765\u53ea\u4f1a\u628a\u6709\u7528\u7684\u8f93\u51fa\u51b2\u6389\u3002\n\n### \u5931\u8d25\u4fe1\u606f\u662f\u5206\u5c42\u7684\n\n\u77ed\u6d88\u606f\u53ea\u4fdd\u7559 6 \u884c\uff0c\u5e76**\u5254\u9664 `hint:` \u884c**\u2014\u2014\u90a3\u4e9b\u884c\u662f\u7ed9\u7ec8\u7aef\u8bfb\u8005\u7684\uff0c\u754c\u9762\u6539\u7528\u672c\u5730\u5316\u7684\u8865\u6551\u8bf4\u660e\uff1b\n\u4f46\u5982\u679c\u5254\u9664\u540e\u4f1a\u4e00\u4e2a\u5b57\u90fd\u4e0d\u5269\uff0c\u5c31\u9000\u56de\u4fdd\u7559 hint\uff08\u89c4\u5219\u662f\u300c\u8bf4\u70b9\u4ec0\u4e48\u300d\uff0c\u4e0d\u662f\u300c\u6765\u81ea hint \u7684\u5c31\u4e00\u5f8b\u4e0d\u8bf4\u300d\uff09\u3002\n\u5b8c\u6574 stdout+stderr \u8d70 `detail` \u5b57\u6bb5\uff0c\u7531 toast \u4e0a\u7684\u300c\u8be6\u60c5\u300d\u94fe\u63a5\u6253\u5f00\u5bf9\u8bdd\u6846\u67e5\u770b\uff08detail \u4e5f\u6709 4000 \u5b57\u7b26\u4e0a\u9650\uff0c\u8d85\u51fa\u52a0\u7701\u7565\u53f7\uff09\u3002\n\n\u5f15\u64ce\u7ed9\u6bcf\u4e00\u7c7b\u5931\u8d25\u6253**\u7a33\u5b9a\u7684\u5206\u7c7b\u7801**\uff0c\u7531\u89c6\u56fe\u672c\u5730\u5316\u6210\u63aa\u8f9e\uff1a`authHint`\uff08`ssh` / `credentials`\uff09\u3001\n`pushHint`\uff08`remote-ahead` / `remote-rejected`\uff09\u3001`pullHint`\uff08`diverged` / `conflicts`\uff09\u3002\n\uff08`needsReconcile` \u4e0d\u662f\u5206\u7c7b\u7801\uff0c\u5b83\u662f\u5f15\u64ce\u5185\u90e8\u7528\u6765\u5224\u65ad\u300c\u662f\u5426\u8be5\u8865\u4e00\u6b21 `--no-rebase`\u300d\u7684\u8c13\u8bcd\uff0c\u89c6\u56fe\u770b\u4e0d\u5230\u5b83\u3002\uff09\n\u65b0\u589e\u4efb\u4f55\u5931\u8d25\u5206\u652f\u65f6\uff0c\u522b\u628a Git \u7684\u539f\u6587\u4e22\u6389\uff0c\u4e5f\u522b\u628a\u6574\u6bb5\u585e\u8fdb toast\u3002\n\n### \u76f8\u5bf9\u8def\u5f84\u4e0e\u771f\u5b9e\u8def\u5f84\n\n\u8def\u5f84\u6bd4\u8f83\u4e00\u5f8b\u6309**\u771f\u5b9e\u8def\u5f84**\uff1aGit \u8fd4\u56de\u7684\u662f\u771f\u5b9e\u8def\u5f84\uff08macOS \u4e0a `/private/var/\u2026`\uff09\uff0c\u5bbf\u4e3b\u7ed9\u7684\u662f\u7528\u6237\u6253\u5f00\u65f6\u7684\u8def\u5f84\uff08`/var/\u2026`\uff09\u3002\n\u7528\u5b57\u7b26\u4e32\u524d\u7f00\u6bd4\u8f83\u4f1a\u628a\u540c\u4e00\u4e2a\u76ee\u5f55\u5224\u6210\u4e24\u4e2a\uff0c\u540e\u679c\u662f**\u9759\u9ed8\u964d\u7ea7**\uff08\u300c\u6253\u5f00\u6587\u4ef6 / \u5728\u8bbf\u8fbe\u4e2d\u663e\u793a\u300d\u88ab\u7981\u7528\uff09\uff0c\u800c\u4e0d\u662f\u62a5\u9519\u3002\n\u89c6\u56fe\u4fa7\u4e0d\u8981\u81ea\u5df1\u62fc\u7edd\u5bf9\u8def\u5f84\uff0c\u7528\u5f15\u64ce\u7b97\u597d\u7684 `repo.workspacePrefix`\uff08`null` \u6709\u8bed\u4e49\uff1a\u4ed3\u5e93\u5728\u5de5\u4f5c\u533a\u4e4b\u4e0a\uff0c\u4e0d\u80fd\u6298\u6210 `\".\"`\uff09\u3002\n\n## \u4e00\u4e2a\u9879\u76ee\u91cc\u7684\u591a\u4e2a\u4ed3\u5e93\n\n\u4e00\u4e2a\u9879\u76ee\u5e38\u5e38\u4e0d\u6b62\u4e00\u4e2a\u4ed3\u5e93\uff1a\u4e00\u4e2a\u5df2\u68c0\u51fa\u7684\u5b50\u6a21\u5757\uff0c\u6216\u8005\u4e00\u4e2a\u6070\u597d\u4f4f\u5728\u53e6\u4e00\u4e2a\u4ed3\u5e93\u91cc\u7684\u514b\u9686\u3002\u5b83\u4eec\u662f**\u72ec\u7acb\u7684\u4ed3\u5e93\uff0c\u4e0d\u662f\u6587\u4ef6\u5939**\u2014\u2014\n\u7236\u4ed3\u5e93\u53ea\u8bb0\u5f55\u5b50\u6a21\u5757*\u6307\u5411\u54ea\u4e2a\u63d0\u4ea4*\u2014\u2014\u6240\u4ee5\u7236\u4ed3\u5e93\u7684 `git status` \u6c38\u8fdc\u53ea\u7ed9\u4e00\u884c gitlink\uff0c\u770b\u4e0d\u5230\u5b50\u6a21\u5757\u91cc\u9762\u7684\u6587\u4ef6\u3002\nCommit \u89c6\u56fe\u56e0\u6b64\u505a\u6210 IDEA \u5f0f\u7684**\u805a\u5408\u663e\u793a**\uff1a\u5148\u6309\u6682\u5b58/\u672a\u6682\u5b58/\u51b2\u7a81/\u672a\u8ddf\u8e2a\u5206\u5927\u7c7b\uff0c\u5927\u7c7b\u4e0b\u6309**\u4ed3\u5e93**\u6392\u2014\u2014\n\u6bcf\u4e2a\u6709\u6539\u52a8\u7684\u4ed3\u5e93\uff08\u7236\u4ed3\u5e93\u53c2\u4e0e\u5b57\u6bcd\u6392\u5e8f\uff09\u5404\u5360\u4e00\u884c\"\u989c\u8272\u5757 + \u540d + N \u4e2a\u6587\u4ef6 + \u5206\u652f\u5fbd\u6807\"\uff0c\u6587\u4ef6\u518d\u5d4c\u5728\u884c\u4e0b\u5c55\u5f00\uff0c\n\u6682\u5b58\u3001diff\u3001hunk\u3001\u56de\u6eda\u90fd\u76f4\u63a5\u53ef\u7528\uff1b\n\u63d0\u4ea4\u6309\u94ae\u7528\u540c\u4e00\u63d0\u4ea4\u4fe1\u606f\u9010\u4ed3\u63d0\u4ea4\uff08\u5b50\u6a21\u5757\u5148\u3001\u7236\u4ed3\u5e93\u540e\uff09\uff0c\u7236\u4ed3\u5e93\u968f\u540e\u51fa\u73b0\u7684\u6307\u9488\u66f4\u65b0\u518d\u63d0\u4ea4\u4e00\u6b21\u5373\u6536\u655b\u3002\n`Commit and Push` \u628a\u521a\u624d\u63d0\u4ea4\u7684\u90a3 N \u4e2a\u4ed3\u9010\u4e2a\u63a8\u51fa\u53bb\uff0c\u4e0d\u518d\u53ea\u63a8\u5f53\u524d\u4ed3\u3002\n\u4ed3\u5e93\u884c\u53f3\u952e\"\u5207\u6362\u5230\u8be5\u4ed3\u5e93\"\u4f1a\u8df3\u5230 Root \u9009\u62e9\u5668\u7684\u90a3\u4e2a\u4ed3\u5e93\uff08Log/\u5206\u652f/\u50a8\u85cf\u4ecd\u6309\u4ed3\u5e93\u5207\u6362\u67e5\u770b\uff09\u3002\n\u63a8\u9001\u8d70 IDEA \u5f0f\u7684 **Push \u5bf9\u8bdd\u6846**\uff1a\u591a\u4ed3\u65f6\u5de5\u5177\u680f Push \u5217\u51fa\u6bcf\u4e2a\u4ed3\u5e93\u7684\u5206\u652f\u53bb\u5411\uff08`main \u2192 origin/main`\uff09\u3001`\u2191/\u2193` \u4e0e\u52fe\u9009\u6846\uff0c\n`Push All` \u9010\u4ed3\u63a8\u9001\uff0c\u5355\u4e2a\u5931\u8d25\u4e0d\u6321\u5176\u4ed6\u4ed3\uff0c\u884c\u5185\u663e\u793a\u6210\u529f/\u62d2\u56e0\uff1b\u5355\u4ed3\u65f6\u4fdd\u6301\u76f4\u63a5\u63a8\u9001\u3002Git \u89c6\u56fe\u5de5\u5177\u680f\u540c\u6837\u6709 Push \u5165\u53e3\u3002\n\u4e24\u4e2a\u5de5\u5177\u680f\u6700\u5de6\u8fb9\u7684\u4ed3\u5e93\u63a7\u4ef6\u4ecd\u7136\u662f\u5207\u6362\u5f53\u524d\u4ed3\u5e93\u7684\u4e1c\u897f\uff1a\u9009\u4e2d\u4e00\u4e2a\uff0c\u89c6\u56fe\u80cc\u540e\u7684\u6bcf\u6761\u547d\u4ee4\uff08\u72b6\u6001\u3001diff\u3001\u65e5\u5fd7\u3001\u5206\u652f\u3001\u50a8\u85cf\u3001\u63d0\u4ea4\u3001hunk \u6682\u5b58\uff09\n\u5c31\u90fd\u5728\u5b83\u91cc\u9762\u8dd1\u3002\n\n\u5de5\u4f5c\u533a\u672c\u8eab\u4e0d\u662f\u4ed3\u5e93\u3001\u4f46\u6587\u4ef6\u5939\u91cc\u5e76\u6392\u6446\u7740\u591a\u4e2a\u4ed3\u5e93\u65f6\uff08`repoA/`\u3001`repoB/`\uff09\uff0c\u540c\u6837\u53ef\u7528\uff1a\u4ed3\u5e93\u5217\u8868\u5217\u51fa\u5b83\u4eec\uff08`sibling repository`\n\u5fbd\u6807\uff09\uff0cCommit \u89c6\u56fe\u805a\u5408\u663e\u793a\u5176\u4ed6\u5e73\u7ea7\u4ed3\u7684\u6539\u52a8\uff0cPush \u5bf9\u8bdd\u6846\u4e00\u6b21\u63a8\u5b8c\u3002\u7a7a\u6587\u4ef6\u5939\uff08\u5185\u65e0\u4ed3\u5e93\uff09\u4ecd\u62a5\"\u4e0d\u662f Git \u4ed3\u5e93\"\u3002\n\n\u5217\u8868\u7531\u5de5\u4f5c\u533a\u4ed3\u5e93\u51fa\u53d1\u904d\u5386\u6784\u5efa\uff0c\u4e14**\u904d\u5386\u662f\u6709\u8fb9\u754c\u7684**\uff1a\u6700\u591a 4 \u5c42\u6df1\u3001\u6700\u591a 5000 \u4e2a\u76ee\u5f55\uff0c\u5e76\u4e14\u4e0d\u4e0b\u6f5c\u4f9d\u8d56/\u6784\u5efa/\u7f13\u5b58\u76ee\u5f55\n\uff08`node_modules`\u3001`vendor`\u3001`Pods`\u3001`.venv`\u2026 \u5171 17 \u4e2a\u540d\u5b57\uff0c\u542b `.git`\uff09\u3002\n\u4f46 `.gitmodules` \u91cc**\u58f0\u660e**\u7684\u8def\u5f84\u4e0d\u53d7\u8fd9\u4e9b\u8fb9\u754c\u9650\u5236\u2014\u2014\u90a3\u91cc\u7684\u6761\u76ee\u662f\u5173\u4e8e\u9879\u76ee\u7684\u65ad\u8a00\uff0c\u800c\u8fb9\u754c\u53ea\u662f\u5bf9\u9879\u76ee\u89c4\u6a21\u7684\u731c\u6d4b\u3002\n\u5df2\u58f0\u660e\u4f46\u672a\u68c0\u51fa\u7684\u5b50\u6a21\u5757\u4e0d\u5217\u51fa\uff1a\u6ca1\u6709\u5de5\u4f5c\u6811\uff0c\u5c31\u6ca1\u5f97\u663e\u793a\u3001\u4e5f\u6ca1\u5f97\u63d0\u4ea4\u3002\n\n\u4e24\u4e2a\u957f\u5f97\u5f88\u50cf\u7684\u4ed3\u5e93\u662f**\u6309\u7236\u4ed3\u5e93\u7684\u7d22\u5f15**\u533a\u5206\u7684\uff0c\u4e0d\u662f\u6309 `.gitmodules`\uff1a\u88ab\u7236\u4ed3\u5e93\u8bb0\u6210 `160000` gitlink \u7684\u8def\u5f84\u662f**\u5b50\u6a21\u5757**\n\uff08\u5728\u90a3\u91cc\u6682\u5b58\u7b49\u4e8e\u8bb0\u5f55\u4e00\u4e2a\u63d0\u4ea4\uff09\uff0c\u5176\u4ed6\u90fd\u662f**\u5d4c\u5957\u4ed3\u5e93**\uff08\u7236\u4ed3\u5e93\u4e0d\u5b58\u5b83\u7684\u4efb\u4f55\u6587\u4ef6\uff09\u3002\u754c\u9762\u4e0a\u5206\u522b\u6253 `submodule` / `nested repository` \u5fbd\u6807\u3002\n\n\u8fd9\u4e2a\u9009\u62e9\u5c5e\u4e8e**\u6253\u5f00\u7684\u90a3\u4e2a\u9879\u76ee**\uff0c\u4e0d\u5199\u8fdb prefs\uff1a\u5207\u9879\u76ee\u3001\u6216\u8005\u628a\u76ee\u5f55\u79fb\u8d70\uff0c\u5c31\u9000\u56de\u5de5\u4f5c\u533a\u81ea\u5df1\u7684\u4ed3\u5e93\u3002\n\n## \u8fdc\u7aef\u540c\u6b65\uff1a\u63a8\u9001\u88ab\u62d2\u4e0e\u5408\u5e76\u51b2\u7a81\n\n\u88ab\u62d2\u7edd\u7684\u63a8\u9001\u662f**\u5e38\u89c4\u60c5\u51b5\uff0c\u4e0d\u662f\u5f02\u5e38**\uff1a\u522b\u4eba\u5f80\u540c\u4e00\u4e2a\u5206\u652f\u63a8\u4e86\u4e1c\u897f\u3002Git \u4f1a\u5728 stderr \u4e0a\u8bf4\u660e\uff0c\u5e76\u5728 `hint:` \u884c\u91cc\u7ed9\u51fa\u8865\u6551\u529e\u6cd5\uff0c\n\u8fd9\u4e24\u8005\u90fd\u8bfb\u2014\u2014\u77ed\u6d88\u606f\u91cc\u662f Git \u81ea\u5df1\u90a3\u51e0\u884c\uff0c\u4e0a\u9762\u90a3\u53e5\u5206\u7c7b\u597d\u7684\u8865\u6551\u8bf4\u660e\u662f\u63d2\u4ef6\u7684\uff1a\n\n| \u5931\u8d25 | \u63d2\u4ef6\u600e\u4e48\u8bf4 |\n| --- | --- |\n| \u63a8\u9001\u88ab\u62d2\uff08`fetch first`\u3001`non-fast-forward`\u3001`stale info`\uff09 | \u8fdc\u7aef\u6709\u4f60\u6ca1\u6709\u7684\u63d0\u4ea4\u2014\u2014\u5148 Fetch\uff0c\u518d Pull\uff0c\u7136\u540e\u91cd\u65b0\u63a8\u9001\uff1b\u5982\u679c\u8be5\u4fdd\u7559\u7684\u662f\u672c\u5730\u5386\u53f2\uff0c\u7528 Force Push |\n| \u63a8\u9001\u88ab\u62d2\uff08`protected branch`\u3001\u94a9\u5b50\uff09 | \u670d\u52a1\u5668\u62d2\u7edd\u4e86\u5b83\uff1b\u5206\u652f\u5927\u6982\u662f\u53d7\u4fdd\u62a4\u7684 |\n| \u62c9\u53d6\u5361\u5728\u51b2\u7a81\u4e0a | \u5728 Changes \u533a\u91cc\u89e3\u51b3\uff0c\u7136\u540e\u63d0\u4ea4 |\n| \u5206\u53c9\u4e14 `pull.ff = only` | \u5148 merge \u6216 rebase\uff0c\u518d\u63a8\u9001 |\n| \u6ca1\u6709\u5b58\u4e0b\u6765\u7684\u51ed\u636e\uff08HTTPS\uff09 | \u5728\u7ec8\u7aef\u91cc\u8dd1\u4e00\u6b21 `git push` \u8ba9\u51ed\u636e\u52a9\u624b\u5b58\u4e0b\u6765\uff0c\u518d\u91cd\u8bd5 |\n| `Permission denied (publickey)` | \u6362\u6210 HTTPS \u8fdc\u7aef\uff0c\u6216\u8005\u8ba9\u5bc6\u94a5\u4e0d\u4f9d\u8d56 `ssh-agent`\u2014\u2014\u5bbf\u4e3b\u4e0d\u4f20 `SSH_AUTH_SOCK` |\n\n\u4e09\u6761\u5f15\u64ce\u51b3\u7b56\u6491\u8d77\u8fd9\u5957\u884c\u4e3a\uff1a\n\n- **\u4e24\u4e2a\u6d41\u90fd\u8bfb\u3002** `git push` \u628a\u62d2\u7edd\u5199\u5728 stderr\uff0c\u4f46 `git merge`\uff08\u4e5f\u5c31\u662f `git pull` \u7684\u540e\u534a\u6bb5\uff09\u628a `CONFLICT` \u5199\u5728 stdout\u3002\n \u53ea\u8bfb stderr \u4f1a\u628a\u4e00\u6b21\u51b2\u7a81\u7684 pull \u6e32\u67d3\u6210\u4e00\u6bb5\u300c\u770b\u8d77\u6765\u50cf\u6210\u529f\u7684 fetch \u65e5\u5fd7\u300d\u3002\n **\u5224\u636e\u662f\u300c\u5931\u8d25\u65f6\u54ea\u4e00\u884c\u80fd\u6307\u51fa\u4e0b\u4e00\u6b65\u300d\uff0c\u4e0d\u662f\u300c\u54ea\u4e2a\u6d41\u66f4\u50cf\u9519\u8bef\u6d41\u300d\u3002**\n- **`git pull` \u6309\u914d\u7f6e\u8dd1\uff0c\u53ea\u5728 Git \u81ea\u5df1\u56e0\u7f3a\u7b56\u7565\u800c\u62d2\u7edd\u65f6\u91cd\u8bd5\u4e00\u6b21\u3002** \u81ea\u4ece 2.27\uff0c\u5728\u5206\u53c9\u5206\u652f\u4e0a\u88f8\u8dd1 `git pull` \u662f\u786c\u5931\u8d25\n \uff08`fatal: Need to specify how to reconcile divergent branches`\uff09\u2014\u2014\u4e8e\u662f\u88ab\u62d2\u7684\u63a8\u9001\u8ba9\u4f60\u8dd1\u7684\u90a3\u6761\u547d\u4ee4\u81ea\u5df1\u8dd1\u4e0d\u8d77\u6765\u3002\n \u53ea\u6709\u8fd9\u4e00\u4e2a\u5931\u8d25\u4f1a\u88ab `--no-rebase`\uff08merge\uff09\u91cd\u8bd5\u4e00\u6b21\uff0c\u5176\u4f59\u7ed3\u679c\u90fd\u662f Git \u7684\u3002\n \u8fd9\u91cc\u4e0d\u505a\u7b56\u7565\u63a8\u5bfc\uff0c\u6240\u4ee5 `branch..rebase`\u3001`pull.rebase = merges|interactive`\u3001`pull.ff = only` \u5168\u90e8\u7167\u5e38\u751f\u6548\u2014\u2014\n \u5b83\u4eec\u662f\u88ab**\u7b2c\u4e00\u6b21\u5c1d\u8bd5**\u8bfb\u5230\u7684\uff0c\u800c\u4e0d\u662f\u88ab\u4e00\u4efd\u66f4\u5dee\u7684 Git \u4f18\u5148\u7ea7\u89c4\u5219\u526f\u672c\u8bfb\u5230\u7684\u3002\n- **Force push \u53ea\u80fd\u662f lease\uff0c\u4e0d\u80fd\u662f\u88f8 force\u3002** `--force-with-lease` \u662f\u63d2\u4ef6\u552f\u4e00\u80fd\u53d1\u51fa\u7684 force\uff1a\u5982\u679c\u8fdc\u7aef\u5df2\u7ecf\u4e0d\u5728\u8fd9\u4e2a\u7a97\u53e3\n \u4e0a\u6b21\u770b\u5230\u7684\u4f4d\u7f6e\uff0c\u5b83\u5c31\u4f1a\u88ab\u62d2\u7edd\uff0c\u4e8e\u662f\u540c\u4e8b\u7684\u63a8\u9001\u6c38\u8fdc\u4e0d\u4f1a\u88ab\u62b9\u6389\u3002\u8fdc\u7aef\u4e0e ref \u662f\u4f4d\u7f6e\u53c2\u6570\uff0c\u6240\u4ee5\u4ea4\u7ed9 Git \u4e4b\u524d\u4f1a\u5148\u6821\u9a8c\u2014\u2014\n `git push origin --force` \u6b63\u662f\u300c\u672a\u6821\u9a8c\u7684 `-` \u5f00\u5934\u53d6\u503c\u300d\u4f1a\u4ea7\u51fa\u7684\u4e1c\u897f\u3002\n\n**\u63a8\u9001\u63a8\u5230\u54ea\u91cc\uff0c\u7531\u5206\u652f\u8ffd\u8e2a\u5173\u7cfb\u51b3\u5b9a**\uff0c\u4e0d\u662f `origin` + \u672c\u5730\u5206\u652f\u540d\u3002\u8fd9\u4e24\u8005\u53ea\u5728\u5206\u652f\u8ffd\u8e2a\u540c\u4e00\u5904\u65f6\u624d\u4e00\u81f4\u2014\u2014\n\u4e00\u65e6\u5206\u652f\u8ffd\u8e2a\u522b\u5904\uff0c\u65e7\u884c\u4e3a\u5c31\u4f1a\u628a\u65b0\u5206\u652f\u63a8\u5230 `origin`\uff0c\u800c \u2191/\u2193 \u6807\u7b7e\u8fd8\u5728\u5bf9\u7740\u771f\u6b63\u7684 upstream \u8ba1\u6570\u3002\n\u5b8c\u5168\u6ca1\u6709 upstream \u65f6\u56de\u9000\u8303\u56f4\u5f88\u7a84\uff1a`origin`\uff0c\u6216\u8005\u53ea\u6709\u4e00\u4e2a\u8fdc\u7aef\u65f6\u5c31\u7528\u5b83\u3002\n\u6709\u591a\u4e2a\u8fdc\u7aef\u53c8\u6ca1 upstream \u65f6\u65e0\u4ece\u63a8\u65ad\uff0c\u4e8e\u662f\u62d2\u7edd\u63a8\u9001\u5e76\u5217\u51fa\u8fdc\u7aef\u5217\u8868\uff0c\u800c\u4e0d\u662f\u628a\u5206\u652f\u53d1\u5e03\u5230\u6392\u5e8f\u7b2c\u4e00\u4e2a\u7684\u540d\u5b57\u4e0a\u53bb\u3002\n\u9996\u6b21\u63a8\u9001\u53ef\u4ee5\u76f4\u63a5\u5efa\u7acb\u8ffd\u8e2a\uff08\u8ffd\u52a0 `--set-upstream`\uff09\u3002\n\u53e6\u5916\u4e24\u79cd\u4f1a\u660e\u786e\u62d2\u7edd\u7684\u60c5\u51b5\uff1a\u5206\u652f\u8ffd\u8e2a\u7684\u662f\u4e00\u4e2a**\u672c\u5730\u5206\u652f**\uff08\u540d\u5b57\u91cc\u6ca1\u6709 `/`\uff09\uff0c\u4ee5\u53ca**\u5c1a\u65e0\u63d0\u4ea4**\u7684\u5206\u652f\u3002\n\n### \u79bb\u5f00\u4e00\u4e2a\u672a\u5b8c\u6210\u7684\u5408\u5e76\n\n\u51b2\u7a81\u7684 `pull` \u4f1a\u628a\u4ed3\u5e93\u7559\u5728\u5408\u5e76\u4e2d\u95f4\uff0c\u4e8e\u662f\u63d0\u4ea4\u6309\u94ae\u4e0a\u65b9\u7684\u72b6\u6001\u884c\u4f1a\u5199\u51fa**\u8fdb\u884c\u4e2d\u7684\u64cd\u4f5c**\u5e76\u5e26\u4e0a\u5b83\u7684\u51fa\u53e3\uff1a\n\u56db\u4e2a\u64cd\u4f5c\u90fd\u6709 **Abort**\uff0c\u53ea\u6709\u5e8f\u5217\u7c7b\u7684\u4e09\u4e2a\uff08cherry-pick / revert / rebase\uff09\u6709 **Continue**\u3002\nmerge **\u4e0d\u8fdb\u8fd9\u4e2a\u5217\u8868**\uff1a\u5b83\u6ca1\u6709\u9700\u8981\u7ee7\u7eed\u7684\u534a\u6210\u54c1\u72b6\u6001\uff0c\u4e00\u6b21\u5408\u5e76\u662f\u9760**\u63d0\u4ea4**\u6765\u7ed3\u675f\u7684\u2014\u2014\u6240\u4ee5\u63d2\u4ef6\u4e0d\u7ed9\u5b83 Continue\n\uff08\u987a\u5e26\u8bf4\u660e\uff1a`git merge --continue` \u5728\u7ec8\u7aef\u91cc\u662f\u5b58\u5728\u7684\uff0c\u53ea\u662f\u8fd9\u91cc\u7528\u4e0d\u4e0a\uff0c\u56e0\u6b64\u4e0d\u63d0\u4f9b\uff09\u3002\nContinue \u7528 `core.editor=true` \u8dd1\uff0c\u56e0\u4e3a\u6ca1\u6709\u7ec8\u7aef\u53ef\u4ee5\u5199\u63d0\u4ea4\u4fe1\u606f\uff0c\u5426\u5219 Git \u53ea\u4f1a\u5931\u8d25\u2014\u2014\u7528\u7684\u662f\u8be5\u64cd\u4f5c\u5df2\u7ecf\u8bb0\u5f55\u597d\u7684\u90a3\u6761\u4fe1\u606f\u3002\n\n\u8fd9\u884c\u5728**\u51b2\u7a81\u88ab\u6682\u5b58\u4e4b\u540e**\u4ecd\u7136\u4fdd\u7559\u64cd\u4f5c\u540d\uff0c\u8fd9\u624d\u662f\u91cd\u70b9\uff1a\u89e3\u51b3\u51b2\u7a81\u4f1a\u628a `u` \u884c\u53d8\u6210\u666e\u901a\u7d22\u5f15\u884c\uff0c\n\u4e8e\u662f porcelain \u4e0d\u518d\u63d0\u5b83\u2014\u2014\u800c\u300c\u628a\u6240\u6709\u51b2\u7a81\u90fd\u6682\u5b58\u4e86\u300d\u6b63\u662f `--continue` \u5f00\u59cb\u80fd\u591f\u6210\u529f\u7684\u65f6\u523b\u3002\n\u628a\u68c0\u67e5\u9650\u5236\u5728\u300c\u6709\u51b2\u7a81\u65f6\u300d\u4f1a\u85cf\u8d77\u6765\u63d2\u4ef6\u81ea\u5df1\u521b\u9020\u7684\u90a3\u4e2a\u72b6\u6001\u7684\u552f\u4e00\u51fa\u53e3\uff0c\u6240\u4ee5\u63a2\u9488\u5728**\u6709\u51b2\u7a81 _\u6216_ \u521a\u624d\u53d1\u73b0\u8fc7\u64cd\u4f5c**\u65f6\u90fd\u8fd0\u884c\u3002\n\n\u4e0d\u8ba4\u8bc6\u7684\u64cd\u4f5c\u540d\u4e0d\u4f1a\u88ab\u8fd0\u884c\uff1a\u5f15\u64ce\u53ea\u63a5\u53d7\u5b83\u80fd\u62a5\u51fa\u7684\u90a3\u56db\u4e2a\u540d\u5b57\uff0c\u6240\u4ee5\u4e00\u4e2a\u7578\u5f62\u7684\u8f7d\u8377\u4e0d\u4f1a\u53d8\u6210\u4e00\u4e2a\u4efb\u610f\u7684 `git` \u52a8\u8bcd\u3002\n\n### \u914d\u7f6e\u914d\u65b9\n\n**GitHub\uff0cHTTPS** \u2014\u2014 `gh auth login` \u7136\u540e `gh auth setup-git` \u4f1a\u628a\u52a9\u624b\u5199\u8fdb `~/.gitconfig`\u3002\u4e0d\u9700\u8981\u522b\u7684\u3002\n\n**GitLab\uff08\u4efb\u610f\u4e3b\u673a\uff09\uff0cHTTPS** \u2014\u2014 \u8ba9 Git \u5b58\u4e00\u6b21\uff1a\n\n```bash\ngit config --global credential.helper osxkeychain # macOS\uff08Linux \u7528 libsecret\uff0c\n # Windows \u7528 manager\uff09\ngit push # \u8f93\u4e00\u6b21 token\uff0c\u6b64\u540e\u90fd\u4f1a\u88ab\u5b58\u4e0b\u6765\n```\n\n\u81ea\u5efa GitLab **\u4e0d\u9700\u8981\u4efb\u4f55\u63d2\u4ef6\u4fa7\u914d\u7f6e**\uff0c\u56e0\u4e3a\u7528\u7684\u5c31\u662f\u4f60 shell \u7528\u7684\u90a3\u4e2a\u51ed\u636e\u5e93\u3002\n\n**SSH** \u2014\u2014 \u65e0\u53e3\u4ee4\u7684\u5bc6\u94a5\u3001\u6216\u8005\u53e3\u4ee4\u5b58\u5728 macOS \u94a5\u5319\u4e32\u91cc\uff08`UseKeychain yes`\uff09\u7684\u5bc6\u94a5\uff0c\u53ef\u4ee5\u76f4\u63a5\u7528\u3002\n\u53ea\u6d3b\u5728 `ssh-agent` \u91cc\u7684\u5bc6\u94a5\u4e0d\u884c\uff0c\u56e0\u4e3a\u5bbf\u4e3b\u4e0d\u4f1a\u628a `SSH_AUTH_SOCK` \u4ea4\u7ed9\u63d2\u4ef6\u8fdb\u7a0b\uff1b\u8fd9\u7c7b\u60c5\u51b5\u8bf7\u7528 HTTPS \u8fdc\u7aef\uff0c\u6216\u628a\u5bc6\u94a5\u52a0\u8fdb\u94a5\u5319\u4e32\u3002\n\n> \u591a\u8d26\u53f7\u914d\u7f6e\uff1a\u63d2\u4ef6\u8bfb\u7684\u662f\u4f60\u7684\u51ed\u636e\u52a9\u624b\u4e3a\u8be5 URL \u89e3\u6790\u51fa\u7684\u90a3\u4e2a\u8d26\u53f7\uff0c\u6240\u4ee5\n> `credential..username` \u548c `includeIf \"gitdir:\u2026\"` \u7684\u89c4\u5219\u5728\u8fd9\u91cc\u548c\u7ec8\u7aef\u91cc\u4e00\u6837\u751f\u6548\u3002\n\n## \u8ba4\u8bc1\n\n**\u63d2\u4ef6\u4e0d\u6301\u6709\u4efb\u4f55\u51ed\u636e\uff0c\u4e5f\u4e0d\u9700\u8981\u3002** \u5b83\u8dd1\u7684\u662f\u7528\u6237\u81ea\u5df1\u7684 `git`\u3001\u5e26\u7684\u662f\u7528\u6237\u81ea\u5df1\u7684 `HOME`\uff0c\n\u4e8e\u662f\u5b83\u7ee7\u627f\u7684\u6b63\u662f\u7ec8\u7aef\u5df2\u7ecf\u5728\u7528\u7684\u90a3\u5957\u4e1c\u897f\uff1a\u540c\u4e00\u4e2a `~/.gitconfig`\u3001\u540c\u4e00\u4e2a\u51ed\u636e\u52a9\u624b\u3001\u540c\u4e00\u4efd `~/.ssh/config` \u4e0e\u5bc6\u94a5\u3002\nshell \u91cc\u4ec0\u4e48\u80fd\u8ba4\u8bc1\u4e00\u6b21 `git push`\uff0c\u8fd9\u91cc\u5c31\u80fd\uff0c\u5728 GitHub\u3001\u81ea\u5efa GitLab \u6216\u4efb\u4f55\u522b\u7684\u5730\u65b9\u2014\u2014**\u6ca1\u6709\u4efb\u4f55\u6309\u4e3b\u673a\u914d\u7f6e\u7684\u4e1c\u897f**\u3002\n\n\u8fd9\u79cd\u7ee7\u627f\u662f\u523b\u610f\u7684\u3002\u63d2\u4ef6\u4e0d\u8be5\u88ab\u6258\u4ed8 token\uff0c\u800c\u4e00\u4efd\u300c\u6309\u4e3b\u673a\u586b\u51ed\u636e\u300d\u7684\u8868\u5355\u4e5f\u53ea\u80fd\u8986\u76d6\u5b83\u8ba4\u8bc6\u7684\u90a3\u4e9b\u4e3b\u673a\u3002\n\n\u63d2\u4ef6\u552f\u4e00\u505a\u4e0d\u5230\u7684\u4e8b\u662f**\u63d0\u95ee**\u3002\u5de5\u5177\u7a97\u53e3\u80cc\u540e\u6ca1\u6709\u7ec8\u7aef\uff0c\u6240\u4ee5\u63d0\u793a\u88ab\u5173\u6389\uff0c\u547d\u4ee4\u4f1a\u7acb\u523b\u5931\u8d25\uff0c\u800c\u4e0d\u662f\u6c38\u8fdc\u6302\u5728\u4e00\u4e2a\u6ca1\u4eba\u80fd\u8f93\u5165\u7684\u5bc6\u7801\u4e0a\u3002\n\u53d1\u751f\u8fd9\u79cd\u60c5\u51b5\u65f6\uff0c\u539f\u59cb\u7684 Git \u9519\u8bef\u4f1a\u8fde\u540c\u300c\u8be5\u600e\u4e48\u529e\u300d\u4e00\u8d77\u663e\u793a\uff08\u89c1\u4e0a\u4e00\u8282\u7684\u8868\uff09\u3002\n\n## \u751f\u6210\u63d0\u4ea4\u4fe1\u606f\n\n\u63d0\u4ea4\u4fe1\u606f\u6846\u65c1\u8fb9\u7684\u95ea\u5149\u6309\u94ae\u4f1a\u66ff\u4f60\u8d77\u8349\u4fe1\u606f\u3002\u5b83\u901a\u8fc7 `pi.agent.complete` \u627e**\u5bbf\u4e3b**\u7684\u6a21\u578b\uff0c\n\u6240\u4ee5\u7528\u7684\u5c31\u662f\u4f60**\u5df2\u7ecf**\u914d\u597d\u7684 provider\u3001\u6a21\u578b\u4e0e\u989d\u5ea6\u2014\u2014\u63d2\u4ef6\u4e0d\u6301\u6709 API key\uff0c\u4e5f\u4e0d\u65b0\u589e\u4efb\u4f55\u8d26\u53f7\u3002\n\n\u5b83\u53d1\u51fa\u53bb\u7684\u662f\u4e09\u6837\u4e1c\u897f\uff1a\u53d8\u66f4\u672c\u8eab\u3001\u4ed3\u5e93\u8fd1\u671f\u63d0\u4ea4\u7684**subject \u4e0e\u6b63\u6587\u6837\u672c**\uff0c\u4ee5\u53ca\u8fd9\u4efd\u6837\u672c\u6d4b\u51fa\u6765\u7684\u4e1c\u897f\u2014\u2014\n\u63d0\u4ea4\u8bed\u8a00\u3001subject \u662f\u5426\u5e26 `type(scope):` \u524d\u7f00\u3001\u6709\u6ca1\u6709\u4eba\u5199\u6b63\u6587\u3002\u6837\u672c\u53d6**\u6700\u8fd1 40 \u6761**\u63d0\u4ea4\u3002\ndiff \u622a\u65ad\u5728 **12 000 \u5b57\u7b26**\uff1a\u8fd9\u662f\u63d0\u793a\u8bcd\uff0c\u4e0d\u662f\u5907\u4efd\u3002\n\n**\u8bed\u8a00\u3002** \u7531\u95ea\u5149\u6309\u94ae\u65c1\u7684\u7bad\u5934\u83dc\u5355\u51b3\u5b9a\uff0c\u56e0\u4e3a\u300c\u7167\u7740\u4ed3\u5e93\u5199\u300d\u4e0d\u662f\u4e00\u6761\u8bed\u8a00\u7b56\u7565\uff1a\n\u4e00\u4efd\u5168\u82f1\u6587\u7684\u5386\u53f2\u4f1a\u8ba9\u4e2d\u6587\u8bfb\u8005\u4e5f\u62ff\u5230\u82f1\u6587\u8349\u7a3f\u3002\u9009\u9879\u662f\n**\u8ddf\u968f\u4ed3\u5e93\u5386\u53f2**\uff08\u9ed8\u8ba4\uff1a\u7528\u5b9e\u6d4b\u8bed\u8a00\uff0c\u6ca1\u6709\u5386\u53f2\u65f6\u56de\u9000\u5230\u754c\u9762\u8bed\u8a00\uff09\u3001**\u7b80\u4f53\u4e2d\u6587**\u3001**English**\u3002\n\u65e0\u8bba\u54ea\u79cd\uff0c`type` \u4e0e `scope` \u90fd\u4fdd\u6301 ASCII\uff0c\u5c31\u50cf Conventional Commits \u7684\u5404\u79cd\u8bed\u8a00\u8bd1\u672c\u505a\u7684\u90a3\u6837\u2014\u2014\n`feat(\u767b\u5f55): \u652f\u6301\u77ed\u4fe1\u9a8c\u8bc1\u7801`\u3002\n\n\u63d0\u793a\u8bcd\u6309 Git \u81ea\u5df1\u7684\u60ef\u4f8b\uff08git-commit(1)\u3001Tim Pope\u3001Chris Beams\u3001Conventional Commits 1.0.0\uff09\u5199\u660e\u786c\u6027\u89c4\u5219\uff1a\nsubject \u540e\u4e00\u4e2a\u7a7a\u884c\u3001\u76ee\u6807 50 \u5b57\u7b26\u4e0a\u9650 72\uff08\u4e2d\u6587\u7ea6 25 \u5b57\uff0c\u56e0\u4e3a CJK \u5b57\u5f62\u5927\u81f4\u662f\u4e24\u500d\u5bbd\uff09\u3001\n\u7ed3\u5c3e\u4e0d\u52a0\u53e5\u53f7\u3001\u82f1\u6587 subject \u7528\u7948\u4f7f\u53e5\u3001\u6b63\u6587\u8bf4 **why** \u800c\u4e0d\u662f\u590d\u8ff0 diff\u3001\n`BREAKING CHANGE:` \u662f\u552f\u4e00\u5141\u8bb8\u5b83\u81ea\u884c\u8ffd\u52a0\u7684 trailer\u3002\n\n**\u5f62\u72b6\u662f\u88ab\u5f3a\u5236\u7684\uff0c\u4e0d\u662f\u88ab\u8bf7\u6c42\u7684\u3002** \u63d0\u793a\u8bcd\u4e0d\u80fd\u662f\u683c\u5f0f\u7684\u6700\u540e\u4e00\u9053\u9632\u7ebf\uff0c\u56e0\u4e3a\u8981\u547d\u7684\u90a3\u4e2a\u5931\u8d25\u5bf9\u5199\u63d0\u793a\u8bcd\u7684\u4eba\u662f\u9690\u5f62\u7684\uff1a\nGit \u628a**\u7b2c\u4e00\u4e2a\u7a7a\u884c\u4e4b\u524d\u7684\u6bcf\u4e00\u884c**\u90fd\u5f53\u6210\u6807\u9898\uff0c\u6240\u4ee5\u4e00\u4e2a\u628a\u6b63\u6587\u7d27\u8d34\u5728 subject \u4e0b\u9762\u7684\u56de\u590d**\u6839\u672c\u6ca1\u6709\u6b63\u6587**\u2014\u2014\n\u5b83\u662f\u4e00\u4e2a\u5de8\u5927\u7684 subject\uff0c\u800c\u8fd9\u6b63\u662f\u8bfb\u8005\u53e3\u4e2d\u7684\u300c\u63d0\u4ea4\u4fe1\u606f\u4e0d\u89c4\u8303\u300d\u3002\u6240\u4ee5\u56de\u590d\u5728\u8fdb\u5165\u4fe1\u606f\u6846\u4e4b\u524d\u4f1a\u8fc7\u4e00\u904d `formatCommitMessage`\uff1a\n\n- \u5148\u5265\u6389 ``` \u4ee3\u7801\u56f4\u680f\u548c `commit message:` / `\u63d0\u4ea4\u4fe1\u606f:` \u8fd9\u7c7b\u524d\u7f00\uff08\u6a21\u578b\u5f88\u7231\u52a0\uff09\uff1b\n- \u4fdd\u8bc1 subject \u662f\u5355\u884c\uff0c\u5e76\u4e14\u65e0\u8bba\u6a21\u578b\u600e\u4e48\u6392\uff0c\u540e\u9762\u90fd\u6070\u597d\u4e00\u4e2a\u7a7a\u884c\uff1b\n- \u8fc7\u957f\u7684 subject \u4f1a\u628a\u5c3e\u5df4**\u5728\u4ece\u53e5\u8fb9\u754c**\u632a\u8fdb\u6b63\u6587\uff0c\u800c\u4e0d\u662f\u622a\u65ad\uff0c\u4e8e\u662f\u6a21\u578b\u4ece diff \u91cc\u8bfb\u5230\u7684\u4fe1\u606f\u4e0d\u4f1a\u4e22\uff1b\n- \u628a\u6b63\u6587\u6298\u5230 Git \u7684 72 \u5217\uff0cCJK \u5b57\u5f62\u6309\u7ec8\u7aef\u90a3\u6837\u7b97\u4e24\u5217\uff1b\n- \u628a\u5206\u53f7\u4e32\u8d77\u6765\u7684\u4ece\u53e5\u62c6\u6210\u300c\u4e00\u4e2a\u60f3\u6cd5\u4e00\u6761\u300d\u7684\u9879\u76ee\u7b26\u53f7\uff1b\n- \u5f53 `,` `;` \u5939\u5728\u4e2d\u6587\u5b57\u7b26\u4e4b\u95f4\u65f6\u89c4\u8303\u6210 `\uff0c` `\uff1b`\u2014\u2014\u800c ASCII \u539f\u6837\u4fdd\u7559\uff0c\u6240\u4ee5 `feat(a,b): \u2026` \u4e0d\u4f1a\u88ab\u78b0\u3002\n\n\u5b83\u4e0d\u6539\u5199\u4efb\u4f55\u63aa\u8f9e\uff0c\u800c\u4e14\u662f**\u5e42\u7b49**\u7684\uff1a\u5f62\u72b6\u5df2\u7ecf\u6b63\u786e\u7684\u8349\u7a3f\u4f1a\u539f\u6837\u901a\u8fc7\u3002\n\n**\u8303\u56f4\u3002** Changes \u5217\u8868\u91cc\u6709\u9009\u4e2d\u7684\u6587\u4ef6\u65f6\uff0c\u5b83\u63cf\u8ff0*\u90a3\u4e2a\u6587\u4ef6*\uff1b\u6ca1\u9009\u4e2d\u65f6\u63cf\u8ff0*\u6240\u6709\u5df2\u6682\u5b58\u5185\u5bb9*\u3002\n\u7528\u4e86\u54ea\u4e00\u79cd\u4f1a\u5728\u63d0\u793a\u6761\u91cc\u8bf4\u660e\uff0c\u6240\u4ee5\u8303\u56f4\u6c38\u8fdc\u4e0d\u662f\u731c\u7684\u3002\u4e24\u8005\u90fd\u4e0d\u5b58\u5728\u65f6\u5b83\u4f1a\u76f4\u8bf4\uff0c\u800c\u4e0d\u662f\u7f16\u4e00\u6761\u4fe1\u606f\u51fa\u6765\u3002\n\n**\u8349\u7a3f\u5c31\u662f\u8349\u7a3f\u3002** \u5b83\u843d\u5728\u4fe1\u606f\u6846\u91cc\uff0c\u53ef\u4ee5\u7167\u5e38\u7f16\u8f91\u3002\u5982\u679c\u4f60\u5df2\u7ecf\u5199\u4e86\u5185\u5bb9\uff0c\u5b83\u4f1a\u5148\u95ee\u4e00\u53e5\u518d\u66ff\u6362\u3002\n\n\u6743\u9650\u662f `models.list`\uff08\u63d0\u4f9b\u6a21\u578b\u83dc\u5355\uff09\u4e0e `agent.complete`\uff08\u9ad8\u98ce\u9669\u2014\u2014\u4f1a\u82b1\u4f60\u7684\u6a21\u578b\u989d\u5ea6\uff09\u3002\n\u5bbf\u4e3b\u628a\u8fd9\u4ef6\u4e8b\u9650\u6d41\u5230**\u6bcf\u5206\u949f 8 \u6b21**\uff1b\u63d2\u4ef6\u628a\u8fd9\u4e2a\u9650\u5236\u62a5\u51fa\u6765\uff0c\u800c\u4e0d\u662f\u76f2\u76ee\u91cd\u8bd5\u3002\n\n## \u914d\u8272\n\n\u6d45\u8272\u914d\u8272\u5927\u90e8\u5206\u6284\u81ea JetBrains \u81ea\u5df1\u7684\u6587\u6863\uff1a\u65b0\u589e\u884c `#c6e4c1`\u3001\u4fee\u6539\u884c `#e9eff9`\u3001\u53d8\u5316\u7247\u6bb5\u84dd `#c6d7f0`\u3001\n\u9762\u677f\u5206\u9694\u7ebf\u3001\u7f16\u8f91\u5668\u8fb9\u680f\u7684\u53d8\u66f4\u6761\uff0c\u4ee5\u53ca\u6587\u4ef6\u72b6\u6001\u8272\uff08\u65b0\u589e `#0a7700`\u3001\u4fee\u6539 `#0032a0`\u3001\u672a\u7248\u672c\u63a7\u5236 `#993300` \u7b49\uff09\u3002\n\u4f59\u4e0b\u7684\u754c\u9762\u9970\u4ef6\u7167\u7740 IntelliJ Light \u4e0e Darcula \u7684\u6837\u5b50\u6765\uff0c\u90a3\u4e9b\u5730\u65b9 JetBrains \u6ca1\u6709\u516c\u5e03\u6570\u503c\u3002\n\n**\u4e00\u4e2a\u523b\u610f\u7684\u504f\u79bb\uff0c\u4e24\u5957\u4e3b\u9898\u90fd\u6709\uff1a** JetBrains \u628a\u5220\u9664\u884c\u8bb0\u6210\u4e00\u4e2a\u4e2d\u6027\u7070\uff08\u6d45\u8272 `#D7D6D6`\uff09\u3002\n\u7d27\u6328\u7740\u7eff\u8272\u7684\u65b0\u589e\uff0c\u90a3\u4e2a\u7070\u8bfb\u8d77\u6765\u50cf*\u892a\u8272*\u800c\u4e0d\u662f*\u88ab\u5220\u6389*\uff0c\u6240\u4ee5\u5220\u9664\u7528\u67d4\u548c\u7684\u7ea2\u8272\u2014\u2014\u6d45\u8272 `#f7d2d2`\uff0c\u6697\u8272 `#452a2e`\u3002\n\n**\u6697\u8272 diff \u914d\u8272\u662f\u8c03\u51fa\u6765\u7684\uff0c\u4e0d\u662f\u6284\u7684\u3002** \u6587\u6863\u91cc\u7684\u6697\u8272\u503c\u7ed9\u51fa\u4e00\u79cd\u504f\u68d5\u7684\u884c\u5e95\u8272\uff0c\u800c\u4e00\u5757\u94a2\u84dd\u8272\u7684\u7247\u6bb5\u8865\u4e01\u538b\u5728\u6697\u7ea2\u884c\u4e0a\u4f1a\u53d8\u6210\u4e00\u56e2\u6ce5\u3002\n\u6240\u4ee5\u6697\u8272\u5e26\u81ea\u5df1\u7684\u4e00\u5957\u503c\uff0c\u800c\u4e14\u53d8\u5316\u7247\u6bb5\u7684\u989c\u8272\u8ddf\u7740\u5b83\u6240\u5728\u7684\u884c\u8d70\uff1a\u5220\u9664\u884c\u4e0a\u66f4\u7ea2\uff0c\u65b0\u589e\u884c\u4e0a\u66f4\u7eff\u3002\n`--diff-fragment-deleted` / `--diff-fragment-inserted` \u662f\u4e24\u4e2a\u8986\u76d6\u70b9\uff08\u53ea\u5728\u6697\u8272\u4e3b\u9898\u91cc\u5b9a\u4e49\uff09\uff1b\u6d45\u8272\u4e3b\u9898\u4e0d\u8bbe\u5b83\u4eec\uff0c\u4fdd\u7559 JetBrains \u7684\u84dd\u3002\n\n\u4e3b\u9898\u5207\u6362\u8d70 `document.documentElement.dataset.theme`\uff0c\u7531 `app.getAppearance` \u521d\u59cb\u5316\u3001\u5e76\u8ba2\u9605 `appearance:changed` \u8ddf\u968f\u5bbf\u4e3b\u3002\n\u5168\u90e8\u90fd\u5728 `src/theme.css` \u9876\u90e8\u7684 CSS \u53d8\u91cf\u91cc\uff0c\u6240\u4ee5\u91cd\u65b0\u8c03\u4e00\u5904\u5c31\u662f\u6539\u4e00\u884c\u3002\n\n## \u6d4b\u8bd5\u4e0e\u5de5\u5177\n\n### \u5f15\u64ce\u56de\u5f52\n\n`tools/harness.mjs` \u5bf9\u7740**\u5f53\u573a\u9020\u51fa\u6765\u7684\u771f\u5b9e\u4ed3\u5e93**\u9a71\u52a8\u5f15\u64ce\u2014\u2014\u4e00\u4e2a\u88f8\u8fdc\u7aef\u3001\u4e00\u4e2a\u76f4\u63a5\u521d\u59cb\u5316\u7684\u5de5\u4f5c\u526f\u672c\u52a0\u4e00\u4e2a\u771f\u6b63\u7684 `git clone`\u3001\n\u4e00\u6b21\u771f\u5b9e\u7684\u53cc\u4eba\u5206\u53c9\u3001\u4e00\u4e2a\u5185\u542b\u5b50\u6a21\u5757\u7684\u5b50\u6a21\u5757\u2014\u2014\n\u5e76\u65ad\u8a00\u90a3\u4e9b\u300c\u62d2\u7edd\u300d\u6240\u4f9d\u8d56\u7684\u884c\u4e3a\uff1a\u5206\u7c7b\u3001\u6d88\u606f\u3001\u8be6\u60c5\u3001\u5148\u9648\u65e7\u518d fetch \u7684 ahead/behind \u6807\u7b7e\u3001\u51b2\u7a81\u7684\u5408\u5e76\u53ca\u5176\u51fa\u53e3\u3001\n\u4e00\u6b21\u63a8\u9001\u843d\u5230\u54ea\u91cc\uff08\u4ee5\u53ca\u88ab\u62d2\u7edd\u843d\u5230\u54ea\u91cc\uff09\u3001\u9648\u65e7\u7684 lease \u6c38\u8fdc\u4e0d\u4f1a\u8986\u76d6\u540c\u4e8b\u7684\u5de5\u4f5c\uff1b\n\u6700\u540e\u51e0\u6bb5\u8fd8\u5305\u62ec\uff1a\u5d4c\u5957\u5728\u53e6\u4e00\u4e2a\u4ed3\u5e93\u91cc\u7684\u4ed3\u5e93\u4f1a\u88ab\u5217\u51fa\u3001\u53ef\u4ee5\u88ab\u9009\u4e2d\u3001\u53ef\u4ee5\u5728\u91cc\u9762\u63d0\u4ea4\u3001\u626b\u63cf\u80fd\u770b\u591a\u8fdc\u3001\n`.gitmodules` \u7684\u58f0\u660e\u80fd\u63a8\u7ffb\u4ec0\u4e48\uff0c\u4ee5\u53ca\u4e00\u4efd\u6765\u81ea\u300c\u89c6\u56fe\u5df2\u7ecf\u79bb\u5f00\u7684\u4ed3\u5e93\u300d\u7684\u8865\u4e01\u4f1a\u88ab\u62d2\u7edd\u800c\u4e0d\u662f\u88ab\u5e94\u7528\u3002\n\n```bash\nnode tools/harness.mjs # \u5b9e\u6d4b\u8f93\u51fa\uff1a136/136 passed\uff0c\u5168\u90e8\u5bf9\u7740\u771f\u5b9e git\nnode tools/harness.mjs --keep # \u4fdd\u7559\u4e34\u65f6\u4ed3\u5e93\uff0c\u4fbf\u4e8e\u4e8b\u540e\u7ffb\u770b\n```\n\n`PLUGIN_DIR` \u53ef\u4ee5\u628a harness \u6307\u5411\u53e6\u4e00\u4efd\u68c0\u51fa\u3002\n\n### \u51b3\u7b56\u7b14\u8bb0\u95e8\u7981\n\n`.agents/notes/` \u4e0b\u7684\u7b14\u8bb0\u627f\u8f7d\u300c\u4ee3\u7801\u672c\u8eab\u5e26\u4e0d\u52a8\u7684\u51b3\u5b9a\u300d\u2014\u2014\u4e3a\u4ec0\u4e48\u662f\u8fd9\u4e2a\u5f62\u72b6\uff0c\u4ee5\u53ca\u5b83\u6362\u6389\u4e86\u4ec0\u4e48\u3002\n\u4e00\u7bc7\u6ca1\u4eba\u80fd\u627e\u5230\u7684\u7b14\u8bb0\u3001\u6216\u8005\u5934\u5757\u6f02\u79fb\u4e86\u7684\u7b14\u8bb0\uff0c\u662f\u4e0b\u4e00\u4e2a\u8bfb\u8005\uff08\u4eba\u6216 agent\uff09\u4e0d\u4f1a\u4fe1\u4efb\u7684\u7b14\u8bb0\uff0c\n\u6240\u4ee5\u5f62\u72b6\u662f**\u5f3a\u5236**\u7684\u800c\u4e0d\u662f\u7ea6\u5b9a\u4fd7\u6210\u7684\uff1a\n\n```bash\nnode tools/notes.mjs # \u4e24\u9879\u6821\u9a8c\uff1a\u76ee\u5f55/\u5206\u7c7b/\u76f8\u5bf9\u94fe\u63a5 + \u5934\u5757/Status/\u5fc5\u9700\u7ae0\u8282\n```\n\n\u4e24\u4e2a\u6821\u9a8c\u5668\u9010\u5b57\u8282 vendored \u5728 `tools/agent-notes/` \u4e0b\uff0c\u6240\u4ee5**\u65e0\u8bba\u673a\u5668\u4e0a\u88c5\u6ca1\u88c5\u90a3\u4e2a skill \u90fd\u80fd\u8dd1**\uff1b\n\u5b83\u4eec\u4e5f\u7531 `node tools/harness.mjs` \u4e00\u8d77\u65ad\u8a00\uff08136 \u6761\u91cc\u6709 2 \u6761\u6765\u81ea\u8fd9\u91cc\uff09\u3002\n\u672c\u673a Node 26 \u80fd\u76f4\u63a5\u6267\u884c `.ts`\uff0c\u4e0d\u9700\u8981 tsx \u6216\u4efb\u4f55 flag\u3002\n\n### \u4e0d\u5f00 GUI \u9a71\u52a8\u5f15\u64ce\n\n`tools/drive.mjs` \u8c03\u7528\u7684\u662f\u89c6\u56fe\u8c03\u7528**\u540c\u4e00\u6279** `onPanelInvoke` \u901a\u9053\uff0c\u53ea\u662f\u7ed9\u4e86\u4e2a\u6869 `pi` \u5168\u5c40\uff0c\n\u6240\u4ee5\u4e00\u6761\u6d41\u7a0b\u53ef\u4ee5\u4ece\u7ec8\u7aef\u6216\u6d4b\u8bd5\u811a\u672c\u91cc\u8dd1\u901a\uff1a\n\n```bash\nnode tools/drive.mjs /path/to/repo git/repo\nnode tools/drive.mjs /path/to/repo git/stage '{\"paths\":[\"src/app.js\"]}'\nnode tools/drive.mjs /path/to/repo git/commit '{\"message\":\"Fix the thing\"}'\n```\n\n\u7528**\u524a\u51cf\u8fc7\u7684\u73af\u5883**\u8dd1\u5b83\uff0c\u624d\u548c\u771f\u5b9e\u63d2\u4ef6\u8fdb\u7a0b\u62ff\u5230\u7684\u4e1c\u897f\u4e00\u81f4\u2014\u2014`PATH`\u3001`LANG` \u548c\u4e34\u65f6\u53d8\u91cf\uff0c\u4f46**\u6ca1\u6709 `HOME`**\uff1a\n\n```bash\nenv -i PATH=\"$PATH\" TMPDIR=\"${TMPDIR:-/tmp}\" node tools/drive.mjs . git/repo\n```\n\n\u8fd9\u4e48\u8dd1\u7b49\u4e8e\u590d\u73b0\u4e86\u771f\u5b9e\u63d2\u4ef6\u8fdb\u7a0b\u7684\u73af\u5883\uff0c\u6240\u4ee5\u63a8\u9001\u8def\u5f84\u4e5f\u80fd\u5728**\u4e0d\u52a0\u7ec8\u7aef**\u7684\u60c5\u51b5\u4e0b\u5bf9\u7740\u4efb\u610f\u8fdc\u7aef\u8bd5\u2014\u2014\n\uff08\u6ce8\u610f harness \u91cc\u5168\u90e8\u8fdc\u7aef\u90fd\u662f\u672c\u5730\u88f8\u4ed3\uff0c\u6ca1\u6709\u771f\u7684\u5f80 HTTPS \u8fdc\u7aef\u63a8\u8fc7\uff1b\u8981\u9a8c\u8bc1\u771f\u5b9e\u6258\u7ba1\uff0c\u8bf7\u81ea\u5df1\u6311\u4e00\u4e2a\u8fdc\u7aef\u8dd1\u4e0a\u9762\u8fd9\u6761\u547d\u4ee4\u3002\uff09\n\n\u6a21\u578b\u76f8\u5173\u7684\u4e24\u4e2a\u901a\u9053\u6709\u6869\uff1a`PIG_FAKE_MODELS`\uff08\u503c `denied` \u4f1a\u8fd4\u56de `PERMISSION_DENIED`\uff09\u3001\n`PIG_FAKE_COMPLETE`\uff08`RATE_LIMITED` / `error:\u2026`\uff09\u3001`PIG_SHOW_PROMPT=1` \u4f1a\u628a\u771f\u6b63\u53d1\u51fa\u53bb\u7684\u63d0\u793a\u8bcd\u6253\u51fa\u6765\u3002\n\n### \u6ca1\u6709\u5bbf\u4e3b\u4e5f\u80fd\u770b\u89c6\u56fe\n\n`tools/smoke.mjs` \u628a\u6784\u5efa\u597d\u7684\u89c6\u56fe\u914d\u4e0a\u6869 `window.pluginBridge` \u5199\u5230 `.smoke/`\uff0c\n\u4e8e\u662f\u90a3\u4e9b\u96be\u4ee5\u6309\u9700\u5236\u9020\u7684\u72b6\u6001\uff08\u4ed3\u5e93\u5361\u5728\u5408\u5e76\u4e2d\u3001\u4e00\u6b21\u88ab\u8fdc\u7aef\u62d2\u7edd\u7684\u63a8\u9001\u3001\u4e00\u4e2a\u5df2\u68c0\u51fa\u7684\u5b50\u6a21\u5757\u4f5c\u4e3a\u5f53\u524d\u4ed3\u5e93\uff09\u53ef\u4ee5\u6e32\u67d3\u51fa\u6765\u770b\uff1a\n\n```bash\nnode tools/build.mjs && node tools/smoke.mjs commit zh-CN\n```\n\n\u89c6\u56fe\u540d\u4e0e\u8bed\u8a00\u90fd\u662f\u4f4d\u7f6e\u53c2\u6570\uff08\u4ea7\u7269\u662f `.smoke/<\u89c6\u56fe>-<\u8bed\u8a00>.html`\uff09\u3002\u6869\u5728\u5de5\u5177\u91cc\uff0c\u4e0d\u5728\u63d2\u4ef6\u91cc\uff0c`.smoke/` \u5df2 gitignore\u3002\n\n## \u5f00\u53d1\u4e0e\u6253\u5305\n\n1. \u6269\u5c55\u9875\u53f3\u4e0a\u89d2 **`\u00b7\u00b7\u00b7` \u2192 \u300c\u52a0\u8f7d\u672c\u5730\u63d2\u4ef6\u300d** \u2192 \u9009\u8fd9\u4e2a\u76ee\u5f55\u3002\n2. \u6539 `src/`\uff0c\u8dd1 `node tools/build.mjs`\uff0c\u89c6\u56fe\u4f1a\u70ed\u91cd\u8f7d\u3002\n3. \u7ec4\u88c5\u5e72\u51c0\u7684\u53d1\u5e03\u76ee\u5f55\u518d\u6253 Pack\uff1a`node tools/build.mjs && node tools/make-publish-dir.mjs`\uff0c\u7136\u540e\u5bf9 `dist-publish/io.github.liushunqiu.pi-idea-git/` \u8dd1 `PluginCheck` / `PluginPack`\uff08\u4ea7\u7269\u5728\u8be5\u76ee\u5f55\u7684 `dist/*.piplug`\uff0c8 \u4e2a\u6587\u4ef6\u7ea6 0.9MB\uff09\u3002**\u4e0d\u8981\u76f4\u63a5\u5bf9\u4ed3\u5e93\u6839\u6253 Pack**\u2014\u2014\u5b83\u4f1a\u628a `.smoke/`\u3001`.memories/`\u3001`tools/`\u3001`src/` \u7b49\u5f00\u53d1\u6587\u4ef6\u4e00\u8d77\u6253\u8fdb\u53bb\uff08`PluginPack` \u4e0d\u8bfb `.gitignore`\uff0c\u4e14\u6ca1\u6709\u6392\u9664\u6587\u4ef6\u673a\u5236\uff0c\u5b9e\u6d4b 2.1MB / 46 \u6587\u4ef6\uff09\u3002\n \u4ece\u8001 ID `local.pi-idea-git` \u5347\u7ea7\u4e0a\u6765\u7684\u7528\u6237\uff0c\u63d0\u4ea4\u4fe1\u606f\u5386\u53f2\u4e0e\u89c6\u56fe\u9009\u9879\u4e0d\u4f1a\u8fc1\u79fb\uff08\u63d2\u4ef6\u6570\u636e\u76ee\u5f55\u6309 ID \u9694\u79bb\uff09\u3002\n\n\u8d28\u91cf\u5e95\u7ebf\uff08\u6539\u5b8c\u4ee3\u7801\u8fc7\u4e00\u904d\uff09\uff1a`node --check` \u6bcf\u4e2a `src/*.js`\u3001`PluginCheck` \u65e0 error\u3001`node tools/harness.mjs` \u5168\u7eff\u3002\n\n> **\u6269\u5927 `permissions` \u9700\u8981\u6bd4\u300cReload\u300d\u6309\u94ae\u66f4\u957f\u7684\u8def\u5f84\u3002**\n> \u4fdd\u5b58\u89e6\u53d1\u7684\u70ed\u91cd\u8f7d\u4f1a\u62d2\u7edd\u4e00\u4e2a\u300c\u8981\u7684\u6743\u9650\u591a\u4e8e\u8fd0\u884c\u5b9e\u4f8b\u5df2\u83b7\u6279\u7684\u300d\u6e05\u5355\u3002\u5361\u7247\u4e0a\u7684 **Reload** \u6309\u94ae\u4e5f\u4e0d\u591f\uff1a\n> \u5b83\u628a\u65b0\u6e05\u5355\u4e0e `registry.json` \u91cc\u8bb0\u5f55\u7684\u6743\u9650\u6c42\u4ea4\u96c6\uff0c**\u9759\u9ed8\u4e22\u6389\u65b0\u589e\u7684\u90a3\u4e9b\uff0c\u5374\u7167\u6837\u62a5\u544a\u6210\u529f**\u3002\n> \u53ea\u6709 **`\u00b7\u00b7\u00b7` \u2192 \u300c\u52a0\u8f7d\u672c\u5730\u63d2\u4ef6\u300d**\uff08\u91cd\u65b0\u9009\u4e00\u6b21\u76ee\u5f55\uff09\u4f1a\u91cd\u8bfb\u6e05\u5355\u5e76\u91cd\u65b0\u5f81\u6c42\u540c\u610f\u3002\n\n\u5bbf\u4e3b\u7248\u672c\u8981\u6c42\u5199\u5728\u540c\u4e00\u4efd\u6e05\u5355\u91cc\uff1a`engines.piDesktop >= 0.8.0`\u3002\n\n## \u5df2\u77e5\u7f3a\u53e3\n\n\u8bda\u5b9e\u6e05\u5355\u2014\u2014\u8fd9\u4e9b\u662f\u5f53\u524d\u5b9e\u73b0\u91cc\u786e\u5b9e\u5b58\u5728\u3001\u4e14\u7528\u6237\u53ef\u80fd\u649e\u4e0a\u7684\u9650\u5236\uff1a\n\n - **\u6587\u672c\u641c\u7d22\u662f\u672c\u5730\u8fc7\u6ee4**\uff1a\u5de5\u5177\u680f\u641c\u7d22\u6846\u53ea\u5728\u5df2\u53d6\u56de\u7684 200 \u6761\u5185\u505a substring \u5339\u914d\uff1b\u8981\u6309\u63d0\u4ea4\u4fe1\u606f\u5728\u670d\u52a1\u7aef\u67e5\uff0c\u7528\u5206\u652f\uff0f\u7528\u6237\uff0f\u65e5\u671f\uff0f\u8def\u5f84\u8fc7\u6ee4\uff08\u5b83\u4eec\u90fd\u8fdb `git log` \u53c2\u6570\uff09\u3002\n- **Console \u4e0d\u662f\u300c\u6bcf\u6761\u547d\u4ee4\u90fd\u8bb0\u300d**\uff1a\u63a2\u6d4b\u578b\u547d\u4ee4\u6210\u529f\u65f6\u4e0d\u8bb0\u5f55\uff08\u89c1\u300c\u5f15\u64ce\u8bbe\u8ba1\u300d\uff09\uff0c\u5931\u8d25\u65f6 short/detail \u90fd\u6709\u957f\u5ea6\u4e0a\u9650\u3002\n- **hunk \u7ea7\u64cd\u4f5c\u7684\u9002\u7528\u9762**\uff1a`Ignore whitespaces` \u6253\u5f00\u65f6\u7981\u7528\uff0c\u672a\u8ddf\u8e2a\u6587\u4ef6\u7981\u7528\uff08\u6574\u6587\u4ef6 `Add` \u4ecd\u53ef\u7528\uff09\u3002\n- **`Edit Commit Message` \u53ea\u5bf9 HEAD \u5f00\u653e**\u3002\n- **Commit \u89c6\u56fe\u6587\u4ef6\u83dc\u5355\u7684\u590d\u5236\u9879**\uff1a\u6709\u63d0\u4ea4\u65f6\u663e\u793a\u300cCopy Revision Number\u300d\u5e76\u590d\u5236 HEAD\uff08\u4e0e Log \u89c6\u56fe\u4e00\u81f4\uff09\uff0c\u5c1a\u65e0\u63d0\u4ea4\u65f6\u663e\u793a\u300c\u590d\u5236\u8def\u5f84/Copy Path\u300d\u5e76\u590d\u5236\u6587\u4ef6\u8def\u5f84\u3002\n- **\u4e24\u5904\u300c\u56de\u6eda\u300d\u540c\u540d\u4e0d\u540c\u4e49**\uff1a\u63d0\u4ea4\u4e0b\u62c9\u91cc\u7684\u300c\u56de\u6eda\u300d\u628a\u5df2\u6682\u5b58\u5185\u5bb9\u79fb\u51fa\u7d22\u5f15\uff08`git/unstage`\uff09\uff0c\u6587\u4ef6\u53f3\u952e\u91cc\u7684\u300c\u56de\u6eda\u300d\u4f1a**\u4e22\u5f03\u6539\u52a8**\uff08`git/discard`\uff0c\u672a\u8ddf\u8e2a\u6587\u4ef6\u76f4\u63a5\u5220\u9664\uff09\u3002\u540c\u540d\uff0c\u4f46\u5371\u9669\u7b49\u7ea7\u4e0d\u540c\u2014\u2014\u6309\u4e0b\u53bb\u4e4b\u524d\u5148\u770b\u5b83\u95ee\u7684\u662f\u4ec0\u4e48\u3002\n- **\u751f\u6210\u7684 HTML \u56fa\u5b9a `lang=\"en\"`**\uff0c\u4e0e\u754c\u9762\u8bed\u8a00\u65e0\u5173\u3002\n- **\u6267\u884c\u8fb9\u754c**\uff1a\u5355\u6761\u547d\u4ee4 25 \u79d2\u540e\u88ab\u6740\uff1bConsole \u53ea\u7559\u6700\u8fd1 200 \u6761\u3001\u65e5\u5fd7\u4e00\u6b21\u6700\u591a\u53d6 500 \u6761\u3001\u9519\u8bef\u8be6\u60c5\u4e0e Console \u7684\u6bcf\u6761\u8f93\u51fa\u90fd\u622a\u5230 4000 \u5b57\u7b26\u2014\u2014\u8fd9\u4e9b\u622a\u65ad\u662f\u9759\u9ed8\u7684\u3002\u552f\u4e00\u4f1a**\u62a5\u51fa\u6765**\u7684\u662f stdout \u8d85\u8fc7 8 MiB\uff1a\u90a3\u6761\u547d\u4ee4\u88ab\u6740\u6b7b\u5e76\u62a5 `Git output exceeded the size limit.`\uff08stderr \u8d85\u9650\u5219\u662f\u9759\u9ed8\u505c\u6b62\u6536\u96c6\uff09\u3002\n- **\u5bbf\u4e3b\u8d85\u65f6**\uff1a\u4efb\u4f55\u4e00\u6b21\u9762\u677f\u8c03\u7528\u8d85\u8fc7 30 \u79d2\uff0c\u90fd\u4f1a\u4ee5\u5bbf\u4e3b\u4fa7\u8d85\u65f6\u7684\u5f62\u5f0f\u5931\u8d25\uff1b\u5f15\u64ce\u7684 25 \u79d2\u4e0a\u9650\u5c31\u662f\u4e3a\u4e86\u8ba9\u5931\u8d25\u5148\u53d1\u751f\u5728 Git \u8fd9\u4e00\u4fa7\u3002\n- **\u6d4b\u8bd5\u4e0d\u8986\u76d6\u771f\u5b9e\u5bbf\u4e3b**\uff1aharness \u4e0e smoke \u7528\u7684\u662f\u6869\uff0c`PluginCheck` \u53ea\u770b `main.js`\uff08\u4e8e\u662f\u89c6\u56fe\u7ecf\u6865\u8c03\u7528\u7684\u6743\u9650\u88ab\u8bef\u62a5\u4e3a unused\uff09\u3002\n\n## \u8bb0\u5fc6\u4e0e\u51b3\u7b56\u7b14\u8bb0\n\n\u4ed3\u5e93\u91cc\u4e24\u7c7b\u7b14\u8bb0\u90fd\u662f\u7eaf Markdown\uff0c\u968f\u5305\u4e00\u8d77\u8d70\uff1a\n\n- `.memories/` \u2014\u2014 \u6392\u67e5\u8fc7\u7a0b\u4e0e\u8fd0\u884c\u65f6\u4e8b\u5b9e\uff08\u63d2\u4ef6\u8fd0\u884c\u65f6\u7ea6\u675f\u3001\u6e32\u67d3\u8fdb\u7a0b CPU \u8bca\u65ad\u6cd5\u3001\u5bbf\u4e3b API \u4e8b\u5b9e\u3001\n push/pull \u51b2\u7a81\u3001\u5d4c\u5957\u4ed3\u5e93\u3001\u7b14\u8bb0 skill \u6f02\u79fb\uff09\u3002\n- `.agents/notes/implemented/architecture/` \u2014\u2014 \u56db\u7bc7\u843d\u5730\u51b3\u7b56\u7b14\u8bb0\uff1a\u4e3a\u4ec0\u4e48\u7528 Git CLI \u800c\u4e0d\u662f\u89e3\u6790 `.git/`\u3001\n \u4e3a\u4ec0\u4e48\u505a\u6210\u4e24\u4e2a docked view\u3001\u4e3a\u4ec0\u4e48\u52a0\u6784\u5efa\u6b65\u9aa4\u3001\u53d8\u66f4\u5217\u8868\u4e3a\u4ec0\u4e48\u6539\u6210\u76ee\u5f55\u6811\uff1b\n \u63d0\u4ea4\u4fe1\u606f\u63d0\u793a\u8bcd\u4e3a\u4ec0\u4e48\u628a\u8bed\u8a00\u505a\u6210\u663e\u5f0f\u53c2\u6570\uff1b\u8fdc\u7aef\u51b2\u7a81\u4e3a\u4ec0\u4e48\u5fc5\u987b\u8bfb\u4e24\u4e2a\u6d41\u3001\u4e3a\u4ec0\u4e48\u53ea\u80fd\u6709 `--force-with-lease`\uff1b\n \u4e3a\u4ec0\u4e48\u4ed3\u5e93\u5217\u8868\u662f\u4f1a\u8bdd\u7ea7\u7684\u3001\u4ee5\u53ca `kind` \u4e3a\u4ec0\u4e48\u7531 gitlink \u5224\u5b9a\u3002\n\n\u6838\u5fc3\u4ee3\u7801\u5165\u53e3\u7559\u4e86\u4e00\u884c `// Note: <\u4e3a\u4ec0\u4e48\u8fd9\u6837\u505a\u3001\u653e\u5f03\u4e86\u4ec0\u4e48> \u2014 \u89c1 .agents/notes/\u2026`\uff0c\u523b\u610f\u4e0d\u9010\u884c\u6807\uff1b\n\u51b3\u5b9a\u88ab\u53d6\u4ee3\u65f6\uff0c\u8fd9\u4e9b\u6ce8\u91ca\u5c31\u662f\u8981\u540c\u6b65\u7684\u4ee3\u7801\u6e05\u5355\u3002\n", + "safetyNotes": "\u53ea\u8bfb\u5de5\u4f5c\u533a\u6587\u4ef6\uff08Open File / Reveal \u8d70\u5bbf\u4e3b fs \u63a5\u53e3\uff09\uff1b\u4e22\u5f03\u672a\u8ddf\u8e2a\u6587\u4ef6\u65f6\u4f1a\u76f4\u63a5\u5220\u9664\u8be5\u6587\u4ef6\uff08\u64cd\u4f5c\u524d\u6709\u786e\u8ba4\u6846\uff09\uff0c\u5176\u4f59\u5199\u64cd\u4f5c\u4e00\u5f8b\u8d70 Git \u547d\u4ee4\u3002\u751f\u6210\u63d0\u4ea4\u4fe1\u606f\u8c03\u7528\u5bbf\u4e3b\u6a21\u578b\uff0c\u7528\u7684\u662f\u4f60\u81ea\u5df1\u7684\u6a21\u578b\u914d\u7f6e\u4e0e\u989d\u5ea6\uff08\u5bbf\u4e3b\u9650\u6d41 8 \u6b21/\u5206\uff09\uff0c\u63d2\u4ef6\u4e0d\u6301\u6709\u4efb\u4f55 API Key\uff0c\u4e0d\u53d1\u8d77\u7f51\u7edc\u8bf7\u6c42\uff0c\u65e0\u9065\u6d4b\u3002HTTPS \u51ed\u636e\u8d70\u4f60\u81ea\u5df1\u7684 Git \u51ed\u636e\u52a9\u624b\uff1b\u53ea\u6d3b\u5728 ssh-agent \u91cc\u7684\u5bc6\u94a5\u7528\u4e0d\u4e86\uff0c\u8bf7\u7528 HTTPS \u8fdc\u7aef\u6216\u94a5\u5319\u4e32\u5bc6\u94a5\u3002", + "versions": [ + { + "version": "0.3.0", + "publishedAt": "2026-09-14T03:27:28Z", + "changelog": "Release 0.3.0: Git operations parity (Branches panel with HEAD/Tags/Remotes/Stashes groups and slash-folder collapsing; branch merge/rebase/rename/upstream/delete; commit copy/compare; toolbar user/date/path server-side filters, Go to HEAD, Fetch+Pull shortcuts); git/log server-side author/since/until/search/paths filters plus git/tags, git/remotes, git/merge, git/rebase and more; remote checkout creates a tracking branch (IDEA behavior); commit-message drafting follows the checked/staged scope.", + "minPiDesktop": ">=0.8.0", + "shasum": "fbf784997dfa00c617437bc3d90d30b1d818d1af37cfb0927c4e22c2b37701f5", + "url": "packages/io.github.liushunqiu.pi-idea-git-0.3.0.piplug", + "sizeBytes": 1057159, + "permissions": [ + "ui.panel", + "ui.view", + "clipboard.write", + "fs.read", + "models.list", + "agent.complete" + ], + "fs": { + "read": { + "root": "workspace", + "scope": [ + "**" + ] + } + } + } + ] + }, { "id": "io.github.muzimu217.deps-audit", "name": "Deps Audit", diff --git a/packages/io.github.liushunqiu.pi-idea-git-0.3.0.piplug b/packages/io.github.liushunqiu.pi-idea-git-0.3.0.piplug new file mode 100644 index 0000000000000000000000000000000000000000..72119cf8c5565721245055ef9d60c63ae97816f6 GIT binary patch literal 1057159 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�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