Files
7418andClaude Opus 4.6 0eabed8c27 feat: Git integration, terminal, unified layout — full Phase 1-5 implementation
**Layout refactor (Phase 1):**
- UnifiedTopBar replacing Header.tsx — chat title editing, project folder,
  commit/push split button, Git branch+dirty badge, terminal/file-tree toggles
- PanelZone renders FileTree, GitPanel, PreviewPanel side-by-side on the right
- Independent panel toggle states in PanelContext
- ResizeHandle unified across all panels
- Removed old RightPanel, Header, DocPreview components

**Git backend (Phase 2):**
- src/lib/git/service.ts — execFile-based Git operations with timeout + injection safety
- API routes: status, branches, checkout, log, commit, push, commit-detail, worktrees, derive
- Worktree derive creates DB session inheriting source session settings

**Git frontend (Phase 3):**
- GitPanel with 4 collapsible sections: Status, Branches, History, Worktrees
- CommitDialog with commit vs commit-and-push modes
- GitBranchSelector with inline error, worktree-occupied branches disabled
- GitWorktreeSection with switch-to/derive actions, current/dirty indicators
- useGitStatus polled in AppShell, derived into context (no redundant setState)

**Terminal (Phase 4):**
- electron/terminal-manager.ts — child_process.spawn fallback (PTY upgrade documented)
- IPC handlers + TerminalDrawer/TerminalInstance components

**Polish (Phase 5):**
- Push inline feedback with 4s auto-dismiss
- Branch detection fix, commit diff exit-code handling
- Removed redundant git state: currentBranch/gitDirtyCount now derived, not setState
- useTerminal isElectron uses lazy initializer instead of effect
- i18n keys (en + zh), user tutorial docs, handover document

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-13 00:38:00 +08:00

198 lines
7.4 KiB
Plaintext
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
---
title: Git 与工作区
description: 在 CodePilot 中管理代码版本、查看文件、使用终端 — 不用离开聊天窗口。
---
# Git 与工作区
CodePilot 不只是一个聊天窗口。你可以在右侧打开文件树、查看 Git 状态、提交代码,甚至打开终端——所有操作都不需要切换到别的应用。
这篇文档会带你了解这些功能怎么用。如果你还不熟悉 Git,别担心,我们会从基本概念讲起。
---
## 先了解几个概念
如果你已经熟悉 Git,可以跳过这一节。
### 什么是 Git?
Git 是一个**版本控制工具**。简单来说,它帮你记录代码的每一次修改,就像文档的"历史记录"功能一样。你可以随时回到之前的版本,也可以和同事协作而不会互相覆盖。
几乎所有的软件项目都用 Git 来管理代码。
### 常见术语
| 术语 | 含义 |
|------|------|
| **仓库(Repository)** | 一个被 Git 管理的项目文件夹。你的项目根目录下会有一个隐藏的 `.git` 文件夹,就说明这是一个 Git 仓库。 |
| **分支(Branch)** | 代码的一条独立时间线。你可以在新分支上开发功能,完成后再合并回主分支。主分支通常叫 `main` 或 `master`。 |
| **提交(Commit)** | 一次代码快照。每次你觉得改动可以"存档"了,就做一次提交。每次提交都需要写一条简短的说明。 |
| **暂存(Stage)** | 选择哪些文件要包含在下一次提交中。CodePilot 目前会自动暂存所有改动。 |
| **推送(Push)** | 把本地的提交上传到远程服务器(比如 GitHub)。团队成员就能看到你的改动了。 |
| **拉取(Pull)** | 把远程服务器上别人的提交下载到本地。 |
| **工作树(Worktree)** | 同一个仓库的多个独立工作目录。可以同时在不同分支上工作,不需要反复切换。 |
---
## 顶栏
打开一个对话后,你会看到顶部有一行操作栏。从左到右依次是:
- **对话标题** — 点旁边的铅笔图标可以重命名
- **项目文件夹名** — 点击可以在系统文件管理器中打开
- 右侧按钮区:**提交** | **Git** | **终端** | **文件树**
这些按钮控制右侧面板和底部终端的开关。你可以同时打开多个面板。
### 提交按钮
点击「提交全部」会弹出提交对话框,让你输入提交说明。有两个选项:
- **提交** — 只保存到本地
- **提交并推送** — 保存到本地,同时上传到远程服务器
按钮右侧的小箭头 ▾ 可以展开菜单,单独触发推送。
### Git 按钮
按钮上直接显示了当前分支名和改动文件数(比如 `main · 3`),方便你随时了解状态。点击后在右侧打开 Git 面板。
---
## 文件树
点击顶栏最右边的文件树按钮,右侧会展开项目的文件目录。
你可以:
- **浏览文件** — 展开文件夹,查看项目结构
- **预览文件** — 点击一个文件,会在旁边打开预览面板,显示文件内容和语法高亮
- **添加到聊天** — 右键点击文件旁的加号,可以把文件作为上下文附加到当前对话
文件树面板的宽度可以拖动左边缘来调整。
---
## 文件预览
在文件树中点击一个文件,预览面板会自动打开。
- **源码视图** — 带语法高亮和行号的代码展示
- **渲染视图** — 对于 Markdown 和 HTML 文件,可以切换到渲染后的效果
顶部有两个切换按钮:`Source`(源码)和 `Preview`(预览)。
预览面板也支持拖动左边缘调整宽度。点击顶部的复制按钮可以复制文件全部内容。
---
## Git 面板
Git 面板分为四个折叠区块。点击标题可以展开或收起。
### 状态
显示当前仓库的核心信息:
- **当前分支** 和它跟踪的远程分支
- **领先/落后** — 你本地有多少提交还没推送,远程有多少提交你还没拉取
- **变更文件** — 列出所有修改过的文件。每个文件前有一个字母标记:
- `M` 修改(Modified)
- `A` 新增(Added)
- `D` 删除(Deleted)
- `R` 重命名(Renamed)
- `?` 未跟踪的新文件(Untracked)
已跟踪的变更(M/A/D/R)排在前面,未跟踪的文件单独一组显示在下方。如果没有任何变更,会显示"所有更改都已提交"。
### 分支
展开后可以看到项目的所有本地分支。点击一个分支名就能切换过去。
注意:如果当前有未提交的改动,分支切换会被禁用,你需要先提交或暂存改动。被其他工作树占用的分支也会标注并禁用。
如果切换失败,错误信息会直接显示在分支列表上方,方便你了解原因。
### 历史
显示最近的提交记录。每条记录包括:
- 提交哈希值(前 7 位)
- 提交说明
- 作者和时间
点击一条记录可以查看该提交的详细改动(diff)。
提交或切换分支后,历史列表会自动刷新。
### 工作树
如果你需要同时在多个分支上工作,可以使用 Git 的工作树功能。
工作树列表会显示:
- 每个工作树对应的分支名
- 路径
- 是否是当前工作树(会高亮并标记"当前")
- 是否有未提交的改动(橙色圆点)
你可以:
- **切换到工作树** — 点击右侧箭头按钮,会打开(或创建)一个绑定到该工作树目录的新对话
- **派生新工作树** — 点击底部的「派生工作树」按钮,输入新分支名,确认后会自动创建工作树目录和对应的对话
---
## 终端
点击顶栏的终端按钮,或者按下快捷键 `Ctrl + `` `(macOS 上是 `Cmd + `` `),底部会弹出一个终端面板。
终端会在当前对话的项目目录中打开,你可以直接运行命令,比如:
```bash
npm install
npm run dev
git status
```
终端面板的高度可以拖动顶部边缘来调整。再次按下快捷键或点击终端按钮即可关闭。
> 当前版本的终端适合运行简单命令和查看输出。对于需要完整终端功能的场景(比如 vim 或 htop),建议使用系统自带的终端应用。
---
## 面板布局
所有面板都在聊天区域的右侧打开,终端在底部。你可以:
- **同时打开多个面板** — 比如同时显示 Git 面板和文件树
- **调整宽度** — 每个面板的左边缘都可以拖动
- **调整终端高度** — 拖动终端的顶部边缘
- **独立开关** — 每个面板的关闭按钮互不影响
面板不会挤压聊天区域到不可用的程度——每个面板都有最小和最大宽度限制。
---
## 常见问题
### Git 面板显示"不是 Git 仓库"
你的项目目录还没有被 Git 管理。在终端中运行 `git init` 初始化一个新仓库,或者直接克隆一个已有的仓库。
### 无法切换分支
最常见的原因是有未提交的改动。先把当前改动提交,或者让 Claude 帮你 stash(暂存到临时区域),然后再切换。
### 推送失败
可能的原因:
- 还没有设置远程仓库 — 在终端中运行 `git remote add origin <你的仓库地址>`
- 没有推送权限 — 检查你的 SSH key 或 token 配置
- 远程有你本地没有的提交 — 先拉取最新代码再推送
### 终端里的程序显示不正常
当前版本的终端使用简化的实现,不支持完整的终端模拟。如果你需要运行 vim、htop 等全屏程序,请使用系统终端。日常的命令执行(安装依赖、启动服务、运行测试等)可以正常使用。