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,有时候就直接 console 里面操作了。有时候也直接在 ide 集成的里面操作了。

emacs 24.4 之后,magit 大版本更新到了 2 的分支,据说进行了重新设计,去掉了一些依 赖,操作速度确实有了明显的提升。抽空看了一下 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 了, buffer 里面列出了每一次操作的详细命令。