Magit - MagicGitTool for Emacs

为什么

  • emacs内置,可以与文件编辑无缝操作。
  • 相比于命令行,对于提交内容的编辑操作更方便。

当然,相比于现在流行的一些git客户端,magit还是没有什么特别的优势,特别是对于大量文件的merge会出现卡顿的现象。但就像emacs每个其他的功能一样,如果你不是emacser,那么这就不是必须;否则就是你很好的帮手。

本文将关注Magit在具体使用上的内容,而不会过多牵涉git的知识。

安装及配置

配置依然按照我的习惯:

  • 使用package管理包
  • vi键位
  • 使用leader键

所以:
将magit、evil-magit加入package-selected-packages,并将status页面绑定到gs按键上:

(require 'evil-magit)
(evil-leader/set-key "gs" 'magit-status)

这样,环境就配置完了。(evil-magit:https://github.com/justbur/evil-magit, 将magit适配了evil)

git status

M-x magit-status或 空格+gs打开status页面,q退出。
status页面是magit的入口,其作用相当于git status,可以看到对比图:
20170206-magit-1.png

看起来差不多。但是magit提供了更方便的方式来对文件的修改进行访问以及操作。

访问

每类文件都有4个展示等级,快捷键分别为1 2 3 4 :
20170206-magit-2.gif

其中2(展示文件层)和4(展示修改细节)常用。

通过j k上下移动光标(C-j C-k按块移动光标),在文件上(或任何上一级项上)按tab将会展示其细节。

操作

具体见evil-magit, 这里只列出常用的一部分:

快捷键 功能
s/u stage/unstage
c commit
p push
x discard
X untrack
v select
b branch
fu fetch
Fu pull
r/ru rebase
o/O reset
i ignore
zz/zp stash
l log
gr refresh
$ show git code
m merge
AA cherry-pick

下面分别进行描述(对于像cc这种两个按键的,实际上是有popup提示的,所以记不住也没关系):

stage/unstage

直接对文件进行stage/unstage,即对文件进行s/u:
20170206-magit-3.gif

对块进行stage/unstage,即对块进行s/u:
20170206-magit-4.gif

commit/push

stage完之后,按cc进行提交,此时会打开新的buffer,在其中编写commit message,C-c C-c提交,C-c C-k取消。
cc - commit
ca - amend

select

magit允许同时对多项进行操作:
20170206-magit-5.gif

branch

bb - checkout
bc - checkout new branch

git log

在status页面按ll就进入了log页面,大概相当于

git log --format="%h * %s %an %ar"

在每个提交上,按回车就可以查看这个提交的详细信息,大概相当于

git show xxx --pretty=fuller

1-4对于这个页面也同样有效。

操作

log

git log相对于git status功能上需要更多的对于查询的侧重,而log页面也有丰富的参数可供使用:
20170206-magit-7.png
从"~/.emacs.d/elpa/magit-20170203.1633/magit-log.el"中可以看到每个选项对应的实际命令行参数:

:switches ((?g "Show graph"              "--graph")
           (?c "Show graph in color"     "--color")
           (?d "Show refnames"           "--decorate")
           (?S "Show signatures"         "--show-signature")
           (?u "Show diffs"              "--patch")
           (?s "Show diffstats"          "--stat")
           (?h "Show header"             "++header")
           (?D "Simplify by decoration"  "--simplify-by-decoration")
           (?f "Follow renames when showing single-file log" "--follow"))
:options  ((?n "Limit number of commits" "-n")
           (?f "Limit to files"          "-- " magit-read-files)
           (?a "Limit to author"         "--author=")
           (?o "Order commits by"        "++order=" magit-log-select-order)
           (?g "Search messages"         "--grep=")
           (?G "Search changes"          "-G")
           (?S "Search occurrences"      "-S")
           (?L "Trace line evolution"    "-L" magit-read-file-trace))

只要按-g或者=n等,就可以设置、取消这些参数了。对于查询某个文件的历史、某个提交者的历史来说都非常方便。

rebase interactive

即git rebase -i,magit里变得稍微方便了一点:
20170206-magit-6.gif

在log页面选择squash开始的commit,然后流程跟命令行也差不多。

reset

log页面另一个主要功能就是代码回滚了:
20170206-magit-7.gif

参考资料


License: CC BY-SA 4.0

Contact