一直用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键就会自动恢复插件版本到上一次记录的稳定版本
通过这种方式既可以尝鲜很多插件的最新版,又可以在最新版不稳定的时候即时回滚到稳定版本,不会因为一键升级插件后无法回滚而浪费很多时间去折腾新版插件。
非图形化功能
有时候,并不需要弹出图形化操作,希望基于当前环境快速进行一些日常操作:
- 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客户端。