Magit 的缘起

很早就开始关注 magit 了,那还是想以 emacs 来完成所有事情的时候。虽然 emacs 内置有 vc 模式,不过不好用,记得那个 vc 模式似乎只对 cvs 的支持还行。最早接触的版本管理软件应该就是 svn 了,自己下载了一个叫 psvn 的插件,用起来也凑合。在 windows 系统上基本只使用乌龟系列的图形端。后来 git 就火起来了,本地部署,不需要服务器的特性确实很好,所以很自然就在写论文的过程中用上了。由于写论文的工具是 emacs 下的 auctex ,希望有个 git 前端,搜了一下,有 git-emacs项目和 magit,测试后发现 git-emacs 操作方便一些,但是 clone 下来的仓库经常安装时候报各种错,很不爽。因此就选了 magit, 就记得 M-x magit-status

最近发现 magit 发展越来越好了,反倒是 git-emacs 慢慢停止维护,后来没了声息。期间也断断续续的用着 magit,有时候也直接使用 git 命令行和 ide 工具中的集成菜单。

emacs 24.4 发布之后,magit 更新到了 v2 的分支。据说进行了重新设计,去掉了一些依赖,操作速度有了明显的提升。于是抽空看了一下 magit 的文档,在这段时间进行了实践,感觉非常不错。

Magit 的日常使用

命令行的困惑

以前有人讲 git 的好处是可以离线提交代码,不用和 svn 一样要提交代码时必须有网络。接着就有人指出,别做梦了,你们离线提交时还不是需要在线 google git 的各种命令用法?确实,git 命令行虽然功能强大,但是很多不常用的功能很容易就忘记了,需要的时候还是要上网去查。在 《Pro git》这本书中,作者讲到删除远程分支的命令时,调侃的说,你最好特别留心这一条命令,因为一定会用到并且很可能会忘记。git 以其多样的命令支持了各种丰富的操作,但是也提高了其使用上的不便,不熟悉的命令使用的时候一定会查询,不管是查 man 还是查网络。

此外,命令行在解决冲突的时候也很麻烦,多数需要使用 mergetool 来调用外部命令。遇到不熟悉的 mergetool 真心很无奈。。。

magit 的优点

magit 是一个集成在 emacs 中的 git 客户端,官方的说法叫做 porcelain。具有操作简单,集成度高的特点。主要通过 popup 接口将常用的一些命令都提示出来,看起来一目了然。甚至有人认为仅仅为了 magit 也值得试一试 emacs。

安装和配置

emacs 24 之后可以直接通过 melpa 安装, 最好使用 emacs 24.4 以及以上版本,这些版本支持 magit 2.1.0 ,全新设计了交互和接口,更方便好用。安装配置很简单:

;; 安装直接 M-x package-install magit
(global-set-key (kbd "C-x g") 'magit-status)
(global-set-key (kbd "C-x M-g") 'magit-dispatch-popup)

绑定的两个快捷键是为了更好的呼出 magit 接口。

使用流程

magit 使用的一般流程是通过 popup 窗口来选择各种操作方式,popup 窗口一般是在magit-status 页面按 h 键或在一个 git 库中使用上面的第二个快捷键,popup 的归类方式非常清晰。一个 popup 项左边是快捷键,右边是解释,提示信息刚刚好。并且 popup 中的快捷键安排也比较符合直观,例如 b 表示 branch 相关的操作,创建,切换,删除,重命名分支等, l 表示 log 相关操作, ll 就可以看到一个比较精美的 log,甚至还有图形化的分支演变过程。

对应的按键都会出现相应的提示,简单的就不讲了,之前提到的删除远程分支,就可以在这个界面先按 b 到达 branch 操作之后,根据提示再按 k , 表示 delete 某个分支,这时会弹出提示,再选择对应的远程分支就行了,例如 origin/to_be_delete.

值得一提的 merge 时会直接调用 ediff, 分作左,右,下三个界面,左边和右边是有冲突的文件,最终的结果就是下面的文件 buffer,比 meld 之流分成三列好多了。通过快捷键 pn 在冲突块之间导航,用 ab 直接接受左边或右边的版本。也可以直接编辑下面窗口。完毕后按 q 退出,ediff 会贴心的问你是否解决冲突完毕。

使用 magit 也可以更好的学习 git 的命令行,因为其将每个操作的 git 命令都保存在一个 buffer 里面,在 magit-status 页面按 $ 命令就可以看到这个 buffer ,其中列出了每一次操作的详细命令。对照着学习,也有助于更好的掌握 git 命令行。