zshell

Git 面板

在产生这些改动的 shell 旁边暂存、审阅、提交和推送。

Cmd+Shift+G。面板会打开在项目所锚定的那个仓库上—— Zshell 怎么选这个目录,见项目目录

这里的每一个操作都是 Zshell 代你执行的 git 命令;只要结果不止「完成了」这么简单,输出就会展示给你。除非你明确要求,否则不会有改写历史、squash 或强推。

Git 工具栏

Zshell 可以在当前标签页下方显示一条紧凑工具栏。在仓库里,它展示当前分支和总新增 / 删除行数;工作区没有改动时显示绿色 Clean,未跟踪文件也会算进新增行数。

  • 点分支名可以搜索并切换本地分支,列表里会标出仓库默认分支。
  • 点变更数字会打开 Git 面板。
  • 不在仓库里时,Always Show 模式保留一个 No Git Repository 按钮,点它进入面板的初始化状态。

设置 → General 里选择 HideAutoAlways 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 HashCopy 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 PathsCopy Repository PathReveal Repository in Finder

拉取只做 fast-forward 是有意的。如果真需要 merge 或 rebase,git 会说出来,由你在终端里决定——面板不会替你挑策略。

还不是一个仓库

如果项目目录里没有仓库,面板会提供 Initialize Repository,它在那个文件夹里执行 git init。在那之前它不会碍事。

本页目录