Submodule列表齐活了,Git Client 是一个大工程呀,每天下班以后没事慢慢写,这玩意不能着急。
明天写一下 Stage/Unstage 的状态。
因为用pygit2这个库和python多线程,性能要比magit快太多了。
慢慢写,功能完善以后会是emacs里面最快的git客户端
我对git也不太熟悉,但是magit 使用来还是感觉很简单的,习惯的命令使用时间长了就成肌肉记忆了。如果一个按键简化功能, 那可能会使得git本身提供的多种功能被忽略了? 速度方面,目前magit 用起来也还算可以,当然我代码库都非常简单。
所以我觉得magit 重不重 我不是很关心(但感觉不是很重,主体都是Elisp, 安装就和其他包没啥区别),在使用方面不复杂,感觉很简单,还帮助我学习了很多git相关的知识。所以我个人,会更倾向于使用比较舒适的magit上。
先做出来用一下,当然两个项目的目标不太一样,EAF Git Client目标是场景化直觉化。
magit的目标是全面覆盖。
我个人对全面覆盖不感兴趣,我就想减轻记忆负担,一些场景化的操作不应该用一系列按键菜单组合来实现,真的记不住。
Stage 和 Unstage 信息搞定了,pygit2 内置的 repo file status API不能直接用,要针对 file status 做两种状态掩码遍历,因为有的文件同时包括 stage hunk 和 unstage hunk.
我最常用的一些操作:
git add -i
进行部分选择(这个操作其实还是鼠标更顺手)。我至今都不太会用 magit。原因大概是:
magit 之前我已经用了很长时间的命令行,积习难改。对每个菜单项与命令的联系也不是十分肯定,担心踩雷。
magit 太复杂了,记不住那么多快捷键,每次都按 ?
也很烦。为此我还特地写了一个叫 stubborn-hydra 的包,来辅助:
当我按下 C-c g
之后,最主要的任务首先是查看修改,挑选合适的内容进行 stage,然后才是其他操作。
这个虽然目前还很 buggy 的扩展大大缓解了我的焦虑,它可以设成在特定 buffer 常驻(C-g
都杀不死,所以起名「顽固的九头蛇」),而在其他 buffer 自动消失。我把它用在 debug/dired/magit… 这些我记不住(也不想记)快捷键的地方。
QwQ终于有大佬愿意救救孩子,每次用magit想pull个仓库查个历史都得纠结半天按哪个怎么按,整个一大谜语人,关键又不太常用,然后就(被)远离了git世界 ……
最希望能把每个状态下可以做的大操作都写个提示在下面,hydra配magit实在太丑了……
如果有需要帮忙可以随时叫我ww
比如我经常在EAF下载目录下开发代码,方便测试,但是我不能直接在用户目录下修改,避免无法干净测试用户更新后的效果(切换分支也容易弄错),所以我会在 HOME 目录下弄一个镜像仓库专门用于推送代码。原来最痛苦的是,目录树特别复杂的时候,我需要做这几个操作:
如果有时候写代码写嗨了,文件改动特别多,上面这个步骤就很繁琐。
今天基于pygit2 API开发了一个高级功能,只用按一个按键, EAF Git Client 自动会把所有文件拷贝到目标镜像目录,然后切换到镜像目录直接提交代码就可以了。再也不用一个文件一个文件的拷贝了。
对,我就是想把初级Git用户的痛点都覆盖到,切换到每个界面,有直观友好的界面和一键式操作和帮助,不用在magit的各种组合菜单中跳来跳去,不好记又头晕。
感谢提供案例分享,我后续融入到我的设计中。
我现在在EAF Git Client的设计是,针对每个高频的操作都设定一个专注的操作界面,用户切换到这个界面,看一下下面的提示,马上就知道怎么操作了。
magit的设计是多个界面组合形成一个复杂操作,我觉得magit最大的缺点还不是记不住,就像你说的,每个菜单扭转的很多,用户的心智是希望确定某个操作就一定干什么活,而不是菜单间排列组合去猜结果,万一猜错了或者理解错了,代码可能就丢了。
这样交流后我就更坚定开发 EAF Git Client了,去掉按键记忆和组合结果的不确定性。
说实话,我不理解为什么magit会有用户存在记不住的现象,毕竟它可以通过M-x来完成所有功能。 另外,我觉得初级用户想用好git,只能去看看pro git或者读git manual…不然能用svn/hg就最好别用git…
magit的痛点在我这里是性能(还有部分的向前兼容),不过一直无从下手去profile
作为一个记性不好的人,我连 debug 都要看一下小抄。
magit 提供菜单界面,让用户以此组合出所需的操作。对于习惯了 git 命令行人,了解每个菜单以及组合产生的作用,是个不小的额外负担,学习的意愿也就有所消减。通过 magit 来操作 git,就像是看翻译的书籍,难免存在理解上的偏差。
「记不住」于我而言是常态,在日常编辑文本的时候,按错键不会造成太大的问题,但是在 magit 可能就是灾难性的。一些 minor mode 也会修改按键绑定,这进一步加剧了不确定性。
我用 magit 主要就是用来 stage(不管是 TUI 还是 GUI,都比 git add -i
来的方便一些,可以直接 stage 选中的部分,不必频繁进/出 git editor)。所以我目前的做法就是把「多余」的 magit 按键隔离起来。这个「隔离层」按键绑定是 100% 确定、不会被覆盖的,它只包含光标移动和 stage 操作相关的键,以及保留一个 ?
通往真正的 magit:
user isolation layer magit
| | |
| move cursor | |
| select/unselect | |
| stage/unstage | |
| toggle sections | |
|------------------->|------------------>|
| |<------------------|
| | |
| ? | |
|--------------------)------------------>|
| | |
| other keys | |
|------------------->|🚫 |
| | |
| | |
| | |
v v v
我觉得 Emacs 自带的 VC 特别好用,特别是查看 log 的速度很快,而且 diff 时有高亮。就是无法做到方便地提交。
不是有 libegit2 的动态模块嘛,之前大仓库是感觉慢,用动态模块好多了。按键记不住,怕按错,难道要纯鼠标操作嘛?
M-x真的是咱emacser的救命神器哈哈
不过我总有一种隐隐的遗憾,作为一款伟大的软件,git本该傲立于世界人民的面前,而非被局限于这一隅。它的功能用在备份上、用在写作上、用在审阅上、用在共享上,都能让其它软件黯然失色。
这个世界是相互平行的,和我擦身而过的路人,可能生活在与我迥然不同的两个世界,被一层可悲的厚障壁相隔。而我与git可能也是如此。
我不想这样。我也愿意尽我一份绵薄之力去改变它。这是我作为一个文科生的想法。
隔行如隔山.
不用 EAF,这里列一下我平常觉得用 magit 会比较方便的功能:
git log <file>
(通过 magit 可以直接看当前文件的),进一步有选中时去执行 magit-log-buffer-file
可以看选中这一块的历史。不需要去手动指定行数。git log -S
等可以直接查看对应的 diff,命令行里得多传参数或是二次操作。大部分便利都在 commit 的选取上,虽然 shell 里有各种补全,但和 magit 里相对提供的信息还是相对较少。另外就是 diff 可以用 ediff 配合。快捷键简化 rebase 那种需要反复重复的工作,而且又因为可视信息较全,要比 cli 下得反复去确认操作来得快。
magit 有个问题是有些命令我找不到对应的功能,比如 checkout -p
加了Log Commit的上下操作, C-m 查看Commit对应的Diff, 先弄成 diff-mode, 以后有时间,可以默认把 diff 显示成双列比较方便。
其他功能慢慢加,开发 Git Client 当重新学习一遍 Git 各种命令。
感谢楼上的案例分享,等基本功能开发完以后再看怎么吸收大家平常的使用场景。
blame 可以看一下我的 GitHub - redguardtoo/vc-msg: Show commit message of current line in Emacs , 可以显示谁修改了选中的代码, 而不是当前一行谁最后碰过的. 仿git-messenger UI,但也和magit无缝整合.
好的,谢谢你的分享