一直用 Emacs 的 magit 来做 Git 代码管理, 直到有一天终于忍受不了 magit, 萌生自己动手写一个 Git 客户端的想法。
主要不满意 magit 的地方:
- 速度慢: 稍微大一点的仓库, 启动和搜索都很慢
- 难记忆: magit 主要靠按键菜单的组合来实现 Git 操作, 现在年纪大了, magit 操作很多都用连续快捷键, 真的记不住
- 不直观: 我希望面向 Git 使用场景提供直观的图形界面进行快速操作, magit 界面默认就是密密麻麻的快捷键菜单, 有时候真的不知道从何下手
经过 20 多天下班时间的开发, 目前 EAF Git Client 已经在日常完全替换 magit, 并具备以下优点:
- 超大日志搜索: 支持 100 万级别(Linux 内核)的日志浏览和搜索, 完全覆盖世界上绝大多数仓库的高性能搜索
- 超高性能: 设计时就充分利用多线程技术, 不会有任何一个操作会卡住 Emacs, 一秒都不会停顿
- 直观界面操作: 根据日常应用场景, 顶部按 1~5 键切换页面, 每个页面都有完整按键帮助, 第一天上手就可以使用, 不需要任何学习门槛
- 日志对比窗口: 支持两个分支日志差异对比, 方便做 rebase 和 cherry-pick 操作, 不需要来回切换分支查看日志去确认
- Submodule 完整支持: 除了基本的添加和删除, 包括子模块的更新和版本回滚都是内置的
- Stash 完整支持: 包括 Stash 的创建、 应用、 弹出、 删除和 Diff 操作
- 贴心小功能: 首页 Diff 实时预览、 一键 Push 操作、 一键回滚本地补丁、 自动创建本地分支…
下面就针对 EAF Git Client 功能进行完整介绍。
首页
首先, EAF Git Client 从上到下分成三个部分: 顶部导航栏、 中间内容区域和底部帮助区域。 按数字 1~5 键可以快速切换到不同页面执行对应的场景命令, 也可以按 h 或 l 这两个按键进行页面左右切换。
首页主要有四个区域:
- Status: 显示当前项目的修改状态, 按 j 或 k 键可以上下切换, 这时可以按 s 或者 d 按键接受修改或删除修改
- Preview: Status 上下切换时, 会实时预览对应的 Diff 内容, Diff 内容可以通过按,或者.键上下滚动
- Stash: 切换分支时, 可以按 x 键把所有修改都暂时存储起来, 方便分支切换后恢复内容
- Unpush: 当你按 c 或 C 键添加一个新的 Commit 后, Unpush 区域就会显示这些还未 Push 到远程分支的补丁
首页除了基本的 pull 和 push 操作外, 还有一些比较贴心的功能:
- 按 n 和 p 键可以选择代码块, 按 S 键可以对选择的代码块进行 Stage 操作, 当你需要基于代码块来构建补丁的时候非常方便
- 按 C 键可以对所有修改快速 Commit, 不用一个文件一个文件的做 Stage 操作
- 按 Y 键可以在提交 Commit 标题后自动 Push 到远程分支
- 按 z 键自动撤销所有本地修改代码
- 按 m 键可以自动拷贝当前分支的所有修改到镜像仓库, 不用一个文件一个文件的拷贝, 提升文件拷贝效率
- 按 S 键可以针对代码块进行 stage 或 unstage 操作, 按 D 键删除代码块
- 按 a 键输入 PR 的 number, 自动 Fetch PR 并创建一个新的分支用于测试 GitHub PR
日志
日志页面最强大的功能就是通过虚拟列表技术实现 100 万级别日志的显示, 即使大如 Linux 内核这般的项目都可以全局搜索。
日志页面第二强大的功能是, 按 i 键可以显示对比分支日志, 方便你左右快速对比后进行分支合并操作(按 b 键)和拷贝补丁到另外分支(按 c 键)。
你也可以通过按 m/u/U 这三个按键快速进行多选, 其他一些常用的操作包括:
- 补丁查看: 直接回车即可
- 回滚补丁: 按 R 键
- 删除最后一个补丁: 按 z 键
- 删除选中到最后范围内所有补丁: 按 Z 键
- 搜索日志: 按 Ctrl + s 键
- 拷贝当前补丁链接: 按 x 键
- 拷贝当前补丁 ID: 按 X 键
分支
分支界面左边显示本地分支, 右边显示远程分支, 这个界面的操作非常简单:
- 切换本地分支: 选中后直接回车
- 新建本地分支: 按 n 键, 会基于当前分支的内容 Clone 一个新的分支
- 删除本地分支: 按 d 键
- 获取远程分支: 按 f 或 F 键
- 以远程分支为基础创建本地分支: 按 c 键会根据你选择的远程分支创建本地分支, 并自动切换到新建的本地分支
储藏
Stash 的概念是, 你有几个不同分支, 你还没有完成当前分支的编码工作, 又不得不切换到其他分支, 同时也不想提交未完善的临时代码, 就可以用 Stash Push 操作来存储所有临时代码(在首页按 x 键)。
当你完成另外一个分支的操作并切换会原来的分支后, 你就可以切换到 Stash 页面恢复临时存储的代码:
- 恢复选中的临时代码: 按 y 键, 这样操作一般比较安全, 即使恢复后文件冲突, 也可以根据未删除的 Stash 信息再次恢复
- 恢复最后一个临时代码: 按 p 键, 这个操作会同时删除最后一个 Stash 记录
- 丢弃临时代码: 直接按 d 键
- 查看补丁: 回车即可
子模块
Submodule 特别适合做 Emacs 插件管理, 下面我按照平常尝鲜 Emacs 插件的流程来介绍怎么用子模块:
- 看到一个好的插件, 切换到子模块页面, 按 a 键下载插件, 然后切换到首页, 按 C 键提交
- 用过一段时间, 感觉新插件不好用, 按 d 键移除插件, 然后切换到首页, 按 C 键提交即可删除插件
- 插件用一段时间后, 想升级看看, 这时候可以直接按 u 键升级插件到最新的代码, 注意这时候不要切换到首页提交, 可以先用一段时间
- 插件更新版本用一段时间后觉得很稳定, 切换到首页, 按 C 键提交
- 插件更新版本用一段时间后觉得不稳定, 在子模块页面, 直接按 r 键就会自动恢复插件版本到上一次记录的稳定版本
- 插件如果要更改路径, 而不用删除子模块再添加子模块, 按 m 键来修改子模块路径
通过这种方式既可以尝鲜很多插件的最新版, 又可以在最新版不稳定的时候即时回滚到稳定版本, 不会因为一键升级插件后无法回滚而浪费很多时间去折腾新版插件。
非图形化功能
有时候, 并不需要弹出图形化操作, 希望基于当前环境快速进行一些日常操作:
- eaf-open-git: 打开 EAF Git 图形客户端, 哈哈哈哈
- eaf-git-clone: 直接执行 git clone 操作
- eaf-git-pull: 直接执行 git pull 操作
- eaf-git-push: 直接执行 git push 操作
- eaf-git-show-history: 显示当前光标处代码的编辑历史, 比 git blame 和 git log -S 都要好用很多
- eaf-git-get-permalink: 获取当前光标处的 Git Web 链接, 比传统打开浏览器用鼠标点击获取 URL 的方法要高效很多
最后
看着是不是很简单很方便? 即使你没有学过 Git 专业知识也可以按键操作, 最爽的是这些按键都在底部有提示, 忘记的时候可以瞟一下底部就可以行云流水的全键盘管理代码了。
欢迎 Git 高手加入我们的开发, 一起构建 Emacs 下最快的 Git 客户端。