1. 背景

因为公司一直使用 svn 进行版本控制,所以除了 magit 之外,Emacs 的 Version Control 也很有必要学习一下了。

ps: 最新的 Emacs 自带 Version Control。

2. 关于 Version Control 的一些概念

  • registered:当一个文件处于版本控制范围内时,我们称其 registered
  • work file:处于版本控制之下的,正在编辑的文件
  • commit / (check in):提交
  • working tree:当前工作目录
  • revision:每个提交创建一个 revision , 每一次提交对应一个 revisionID(revision number)
  • update/ (check out):更新
  • VC filesets: VC 操作的一个或者多个文件集合

3. 使用

3.1 看懂 Mode Line

状态栏上有几个标志,其中有一个是表示 VC 的状态。例如 SVN-141245 。

中间的符号的意义:

  • - 代表文件与上次提交没有任何改变
  • : 代表文件被修改了
  • ! 代表冲突
  • ? 代表文件在版本控制之下,但是 working tree 中不存在

3.2 基本操作

  • C-x v v:对处于同一状态下的 filesets 执行下一个需要做的操作(没有注册就注册,没有提交就提交,如果提交的话就会触发一个 *vc-log* buffer,在其中输入提交信息然后按 C-c C-c 提交)。如果在 SVN 这种集中式管理系统中,仓库有更新,这个命令会直接合并更新到本地。
  • C-x v +:在 git 这种分布式管理系统中,当仓库文件已经被修改了,你需要先更新。
  • C-x v m:merge 文件

3.3 Log Buffer

在输入命令 C-x v v 之后会出现一个 Log Buffer,这个 buffer 的顶部会有 Summary 的字样,在这之后写的文字都会被记录到 log 中。

  • C-c C-c:提交
  • C-c C-f:显示修改的文件
  • C-c C-d:显示 diff

3.4 注册 (registering)

C-x v i 将文件放到版本控制系统控制之下

3.5 同旧版本比较和检查

  • C-x v =: diff
  • M-x vc-ediff: ediff
  • C-x v D: 比较整个 working tree
  • C-x v g: 显示文件修改注释

3.6 VC Change Log 修改日志

  • C-x v l:显示当前文件的修改日志
  • C-x v L:显示当前仓库的修改日志

3.6.1 在 vc-change-log buffer 中的操作

  1. n:下一条改动
  2. p:上一条改动
  3. d:显示一次提交的指定文件较上一次的修改
  4. D:显示一次提交的所有的文件较上一次的修改

3.7 撤销

C-x v u:将所做的改动撤销回上一次版本

3.8 忽略文件

C-x v G:在 VC 系统中忽略一个文件

3.9 文件夹模式

通过文件夹模式,可以浏览一个 working tree 中的所有文件的状态,并且对文件进行操作。

C-x v d:进入文件夹模式

文件夹模式显示示例:

1
2
3
4
5
6
./
edited configure.ac
* added README
unregistered temp.txt
src/
* edited src/main.c

注:*:被标记的文件

3.9.1 文件夹模式的命令

  • n or SPC :下一个文件
  • p:上一个文件
  • TAB:移动到下一层文件夹
  • S-TAB:移动到上一层文件夹
  • m:标记文件
  • u:取消标记
  • M:多文件标记
  • q:退出
  • x:隐藏已经 up-to-date 的文件
  • S:搜索文件

3.10 分支

  • C-x v r branch-name RET:切换分支
  • C-x v m:合并
  • C-u C-x v v:在 SVN 中,这个命令可以创建一个分支,但是需要输入一个分支开始的 reversion id 。

总结

在最新版的 Emacs 中,已经集成了 Version Control 这个插件。在 spacemacs 中,需要在 layer 层加上 version control 。当然,如果只是用 git 来管理的话,选 magit 来使用必然是上策。

参考文献

[0]:GNU Emacs Manual: Version Control