Git 面板
在产生这些改动的 shell 旁边暂存、审阅、提交和推送。
按 Cmd+Shift+G。面板会打开在项目所锚定的那个仓库上—— Zshell 怎么选这个目录,见项目目录。
这里的每一个操作都是 Zshell 代你执行的 git 命令;只要结果不止「完成了」这么简单,输出就会展示给你。除非你明确要求,否则不会有改写历史、squash 或强推。
Git 工具栏
Zshell 可以在当前标签页下方显示一条紧凑工具栏。在仓库里,它展示当前分支和总新增 / 删除行数;工作区没有改动时显示绿色 Clean,未跟踪文件也会算进新增行数。
- 点分支名可以搜索并切换本地分支,列表里会标出仓库默认分支。
- 点变更数字会打开 Git 面板。
- 不在仓库里时,Always Show 模式保留一个 No Git Repository 按钮,点它进入面板的初始化状态。
在 设置 → General 里选择 Hide、Auto 或 Always Show,也可以设置
toolbar.visibility。默认是 Hide。已经显示的工具栏也能从右键菜单里隐藏。
变更的文件
文件按冲突、已暂存和未暂存分组。把鼠标移到某一行会出现按钮,右键菜单里也有:
| 按钮 | 作用 |
|---|---|
| + | 暂存该文件 |
| − | 取消暂存 |
| ↺ | 丢弃它的改动 |
Discard All Changes 在面板头部,并且会先要求确认——它是这里唯一一个没法用另一条 git 命令撤回的操作。
冲突文件显示的是 Mark Resolved (Stage) 而不是普通的暂存按钮,让「标记为已解决」成为一个明确的动作,而不是顺手的副作用。
头部的漏斗按钮按文件名过滤列表,改动很多时这是最快的走法。
看 diff
点任意一个变更文件,它的 diff 会在一个窗格里打开,是在终端旁边而不是盖在上面。右键菜单里还可以 Open File(文件本身,可编辑)或 Open File to the Side。
大 diff 也不会卡。上千个文件的改动集,打开速度和一行的一样,滚动也不掉帧。
Diff 上方的控件会全局记住两组选择:
- Unified / Split 在单栏和左右对照布局之间切换。
- Review / Edit 只会出现在实时工作区里尚未暂存的文件上。进入 Edit 后可以直接改新版内容,用 Cmd+S 保存;有未保存内容时,关闭行为和普通编辑器一致。
已经暂存的 diff 和历史提交 diff 始终只读,因为它们是快照,不是 Zshell 可以安全写回的文件。在某个 diff 里切到 Edit 或 Split,会同步其他已打开 diff 的偏好,但不会让不符合条件的快照突然变得可编辑。
提交
写好信息用提交按钮,或者从它的菜单里挑:
- Commit Staged——只提交你暂存了的
- Stage All & Commit——先暂存所有已跟踪文件,再提交
- Amend Last Commit——把暂存的改动折进上一个提交
- Stage All & Amend
下方列着最近的提交,右键有 Copy Commit Hash 和 Copy Commit Message。
分支
头部的分支名是一个菜单:选另一个分支就切过去,或者选 Create New Branch… 从当前位置开一个新分支。
工作树
Git 面板会列出这个仓库的所有工作树,以及它们对应的分支和检出路径。当前检出会标记为 Current。点某个工作树,就会在对应目录新开一个终端标签页;每个检出都有自己的 shell 上下文,同时仍属于同一个项目。
处于 detached HEAD 状态的工作树会显示 Detached HEAD,而不是分支名。裸仓库也会列出,但它没有工作目录,不能在终端标签页中打开。
远端
⋯ 菜单里是所有和远端打交道的操作:
| 操作 | 作用 |
|---|---|
| Fetch | 更新远程跟踪引用 |
| Pull (Fast-forward Only) | 拉取,拒绝产生合并提交 |
| Push | 推送当前分支 |
| Publish Branch | 推送还没有 upstream 的分支;远端不止一个时让你选 |
| Sync Changes | 先 fast-forward 拉取,再推送 |
| Stash All Changes | 把所有改动(含未跟踪文件)存进 stash |
| Pop Stash | 恢复最近一次 stash |
分支旁边的徽章显示你比 upstream ↓ 落后和 ↑ 领先多少。
同一个菜单里还有 Copy Changed Paths、Copy Repository Path 和 Reveal Repository in Finder。
拉取只做 fast-forward 是有意的。如果真需要 merge 或 rebase,git 会说出来,由你在终端里决定——面板不会替你挑策略。
还不是一个仓库
如果项目目录里没有仓库,面板会提供 Initialize Repository,它在那个文件夹里执行
git init。在那之前它不会碍事。