Magit 介绍

MagitEmacs 中的一个用于管理 Git 的工具,可以理解为 Git 的前端操作界面。和 SourceTree 客户端类似,不过功能却强大太多了,这也是我使用 Emacs 的一个重要理由。

Magit 中有许多非常强大的功能,这里介绍几个非常有用,但是又不容易记住的。

本文的 Magit 所使用的快捷键需要配合 evil-mode 使用。

Reflog

reflog 介绍

我们平时使用 git log 来查看提交的记录, git reflog 使用就相对较少了,大家比较陌生。

git reflog 可以用来查看你的所有操作记录,在特殊情况下是救命良药。

考虑这么一种情况,你用 git reset --hard HEAD~1 回退到上个版本,这时候你用 git log 发现少了一个 commit ,这时候就需要使用 git reflog 来找回被回退的 commit

Magit Reflog

Magit 要使用 reflog 只需要在 Magit Mode 中,按下 l ,就会弹出如下选项 接下来就可以根据自己的需要选择(按下括号中的字母)当前分支(r)、其它分支(O)、HEAD(H)。

当我按下 H ,选择 HEAD 的时候,如下所示。

reflog 单独使用也就是个查看 log 的功能,但当它配合其它操作就可以发挥非常大的威力,比如 cherry-pickrebase 、找回丢失的 commit

Rebase

rebase 就不用多说了,日常使用频率挺高的一个。

Magit Mode 下,按下 r 会弹出具体操作的提示 主要包括 interactively(i)modify(m)reword(w)remove(k)squash(f) 这几个选项。

你也可以通过 Arguments 选项来一起添加参数。例如输入 -iInteractive 这行会高亮显示。

接着输入 k 尝试删除一个 commit 我们把光标移动到 first headline ,然后按下 C-c C-c ,这样就完成操作了。

如果发生了冲突,还需要先解决冲突,解决完冲突后按下 r ,弹出如下选项

接着根据自己的需要选择 Continue(r)Skip(s)Edit(e)Abort(a) 中的一个,一般我们按下 r 选择 Continue

如果不想继续操作了,按下 a 选择终止,则所有操作无效。

除了上面这种常规操作,还可以在上面提到的 reflog 中使用 rebase ,操作都是类似的,先按下 r 选择需要的操作,然后根据需要进行下一步,这里都是类似的,我就不再啰嗦了。

Rebase 合并提交

假设我现在如下三个提交记录,我想要合并成一个,要怎么操作呢? 我们把光标移动到 track magit 也就是 commit-idadf4ce4 的记录上,按下 r i ,出现如下交互界面 我们可以在每个 commit 上执行如下操作

快捷键 作用
p 使用这个 commit
r 使用这个 commit,但是要修改消息
e 使用这个 commit,但是不仅仅是修改消息
s 使用这个 commit,和前一个进行合并
f 和 s 类似,但是不要注释
d 丢弃这个 commit

所以我们如果需要合并这三个提交的话,只需要把 1a49314d146362 使用 s 进行合并就行了。分别在这两个 commit 上按下 s ,如下所示 可以发现这两个 commitpick 变成了 squash ,接着我们使用 C-c C-c 来使这些修改生效。 这里会让你进一步确认消息,如果没错的话,再次按下 C-c C-c ,这样就三个消息就合并成一个了。

Cherry-Pick

cherry-pick 平时用的比较少,不过在多分支开发的时候却非常有效。假如我们在 develop 分支上的一个 commit 想要合到 master ,这时候就可以使用 cherry-pick 了。

首先在 Maigt Mode 中,按下 Y 在弹出的选项中选择 Cherry-head ,表示的是要从哪里开始 Cherry-Pick

选择好了 Cherry-head 后,需要选择 Cherry-upstrem ,表示的是要 Cherry-Pick 到哪里。

我这里就是从 developmaster 。选好之后如下所示。

接着我们就可以在 eaaf552 这个 commit-id 上按下 A 表示我要对这个 commit 进行操作了,如下所示

接着再按下 A 选择 Pick ,这时会让你选择一下分支,这里就是 develop ,选中后回车,这样就结束了。

结合 Reflog 使用

上面的 cherry-Pick 使用起来有些麻烦,这里提供一个更简便的操作,也就是结合 Reflog 使用。

先使用 l O 打开 developReflog ,如下所示 接着我们在 eaaf552 这个 commit 中按下 A ,依然是选择 Pick 再按下 A ,选择分支后回车,完成 Cherry-Pick 的操作。后的这几步都是一样的。

总结

今天主要介绍了 Magit 使用中的几个小技巧,在平时开发时会带来极大的便利,希望对你有帮助。