EAF Git Client 手册
Emacs
EAF
2022-04-22 2678字

一直用 Emacs 的 magit 来做 Git 代码管理, 直到有一天终于忍受不了 magit, 萌生自己动手写一个 Git 客户端的想法。

主要不满意 magit 的地方:

  1. 速度慢: 稍微大一点的仓库, 启动和搜索都很慢
  2. 难记忆: magit 主要靠按键菜单的组合来实现 Git 操作, 现在年纪大了, magit 操作很多都用连续快捷键, 真的记不住
  3. 不直观: 我希望面向 Git 使用场景提供直观的图形界面进行快速操作, magit 界面默认就是密密麻麻的快捷键菜单, 有时候真的不知道从何下手

经过 20 多天下班时间的开发, 目前 EAF Git Client 已经在日常完全替换 magit, 并具备以下优点:

  1. 超大日志搜索: 支持 100 万级别(Linux 内核)的日志浏览和搜索, 完全覆盖世界上绝大多数仓库的高性能搜索
  2. 超高性能: 设计时就充分利用多线程技术, 不会有任何一个操作会卡住 Emacs, 一秒都不会停顿
  3. 直观界面操作: 根据日常应用场景, 顶部按 1~5 键切换页面, 每个页面都有完整按键帮助, 第一天上手就可以使用, 不需要任何学习门槛
  4. 日志对比窗口: 支持两个分支日志差异对比, 方便做 rebase 和 cherry-pick 操作, 不需要来回切换分支查看日志去确认
  5. Submodule 完整支持: 除了基本的添加和删除, 包括子模块的更新和版本回滚都是内置的
  6. Stash 完整支持: 包括 Stash 的创建、 应用、 弹出、 删除和 Diff 操作
  7. 贴心小功能: 首页 Diff 实时预览、 一键 Push 操作、 一键回滚本地补丁、 自动创建本地分支…

下面就针对 EAF Git Client 功能进行完整介绍。

首页

Dashboard

首先, EAF Git Client 从上到下分成三个部分: 顶部导航栏、 中间内容区域和底部帮助区域。 按数字 1~5 键可以快速切换到不同页面执行对应的场景命令, 也可以按 h 或 l 这两个按键进行页面左右切换。

首页主要有四个区域:

  1. Status: 显示当前项目的修改状态, 按 j 或 k 键可以上下切换, 这时可以按 s 或者 d 按键接受修改或删除修改
  2. Preview: Status 上下切换时, 会实时预览对应的 Diff 内容, Diff 内容可以通过按,或者.键上下滚动
  3. Stash: 切换分支时, 可以按 x 键把所有修改都暂时存储起来, 方便分支切换后恢复内容
  4. Unpush: 当你按 c 或 C 键添加一个新的 Commit 后, Unpush 区域就会显示这些还未 Push 到远程分支的补丁

首页除了基本的 pull 和 push 操作外, 还有一些比较贴心的功能:

  1. 按 n 和 p 键可以选择代码块, 按 S 键可以对选择的代码块进行 Stage 操作, 当你需要基于代码块来构建补丁的时候非常方便
  2. 按 C 键可以对所有修改快速 Commit, 不用一个文件一个文件的做 Stage 操作
  3. 按 Y 键可以在提交 Commit 标题后自动 Push 到远程分支
  4. 按 z 键自动撤销所有本地修改代码
  5. 按 m 键可以自动拷贝当前分支的所有修改到镜像仓库, 不用一个文件一个文件的拷贝, 提升文件拷贝效率
  6. 按 S 键可以针对代码块进行 stage 或 unstage 操作, 按 D 键删除代码块
  7. 按 a 键输入 PR 的 number, 自动 Fetch PR 并创建一个新的分支用于测试 GitHub PR

日志

Log

日志页面最强大的功能就是通过虚拟列表技术实现 100 万级别日志的显示, 即使大如 Linux 内核这般的项目都可以全局搜索。

日志页面第二强大的功能是, 按 i 键可以显示对比分支日志, 方便你左右快速对比后进行分支合并操作(按 b 键)和拷贝补丁到另外分支(按 c 键)。

你也可以通过按 m/u/U 这三个按键快速进行多选, 其他一些常用的操作包括:

  1. 补丁查看: 直接回车即可
  2. 回滚补丁: 按 R 键
  3. 删除最后一个补丁: 按 z 键
  4. 删除选中到最后范围内所有补丁: 按 Z 键
  5. 搜索日志: 按 Ctrl + s 键
  6. 拷贝当前补丁链接: 按 x 键
  7. 拷贝当前补丁 ID: 按 X 键

分支

Branch

分支界面左边显示本地分支, 右边显示远程分支, 这个界面的操作非常简单:

  1. 切换本地分支: 选中后直接回车
  2. 新建本地分支: 按 n 键, 会基于当前分支的内容 Clone 一个新的分支
  3. 删除本地分支: 按 d 键
  4. 获取远程分支: 按 f 或 F 键
  5. 以远程分支为基础创建本地分支: 按 c 键会根据你选择的远程分支创建本地分支, 并自动切换到新建的本地分支

储藏

Stash

Stash 的概念是, 你有几个不同分支, 你还没有完成当前分支的编码工作, 又不得不切换到其他分支, 同时也不想提交未完善的临时代码, 就可以用 Stash Push 操作来存储所有临时代码(在首页按 x 键)。

当你完成另外一个分支的操作并切换会原来的分支后, 你就可以切换到 Stash 页面恢复临时存储的代码:

  1. 恢复选中的临时代码: 按 y 键, 这样操作一般比较安全, 即使恢复后文件冲突, 也可以根据未删除的 Stash 信息再次恢复
  2. 恢复最后一个临时代码: 按 p 键, 这个操作会同时删除最后一个 Stash 记录
  3. 丢弃临时代码: 直接按 d 键
  4. 查看补丁: 回车即可

子模块

Submodule

Submodule 特别适合做 Emacs 插件管理, 下面我按照平常尝鲜 Emacs 插件的流程来介绍怎么用子模块:

  1. 看到一个好的插件, 切换到子模块页面, 按 a 键下载插件, 然后切换到首页, 按 C 键提交
  2. 用过一段时间, 感觉新插件不好用, 按 d 键移除插件, 然后切换到首页, 按 C 键提交即可删除插件
  3. 插件用一段时间后, 想升级看看, 这时候可以直接按 u 键升级插件到最新的代码, 注意这时候不要切换到首页提交, 可以先用一段时间
  4. 插件更新版本用一段时间后觉得很稳定, 切换到首页, 按 C 键提交
  5. 插件更新版本用一段时间后觉得不稳定, 在子模块页面, 直接按 r 键就会自动恢复插件版本到上一次记录的稳定版本
  6. 插件如果要更改路径, 而不用删除子模块再添加子模块, 按 m 键来修改子模块路径

通过这种方式既可以尝鲜很多插件的最新版, 又可以在最新版不稳定的时候即时回滚到稳定版本, 不会因为一键升级插件后无法回滚而浪费很多时间去折腾新版插件。

非图形化功能

有时候, 并不需要弹出图形化操作, 希望基于当前环境快速进行一些日常操作:

  1. eaf-open-git: 打开 EAF Git 图形客户端, 哈哈哈哈
  2. eaf-git-clone: 直接执行 git clone 操作
  3. eaf-git-pull: 直接执行 git pull 操作
  4. eaf-git-push: 直接执行 git push 操作
  5. eaf-git-show-history: 显示当前光标处代码的编辑历史, 比 git blame 和 git log -S 都要好用很多
  6. eaf-git-get-permalink: 获取当前光标处的 Git Web 链接, 比传统打开浏览器用鼠标点击获取 URL 的方法要高效很多

最后

看着是不是很简单很方便? 即使你没有学过 Git 专业知识也可以按键操作, 最爽的是这些按键都在底部有提示, 忘记的时候可以瞟一下底部就可以行云流水的全键盘管理代码了。

欢迎 Git 高手加入我们的开发, 一起构建 Emacs 下最快的 Git 客户端。