magit 比 git CLI 好用在哪里?

如题, 看到很多人说 magit 是他们最离不开的. 但我真的有些奇怪, magit 到底哪里比 git CLI 方便? 对我来说, 可以只 pick 一些 hunks 而不是全部, 这点很方便. 但其它的, 我真没太 get 到, 尤其是稍微大一点的 repo, 我感觉 magit-status 比 git status 卡太多了.

1 个赞

怎么一股知乎味。。谁离不开了?

4 个赞

知乎刷多了, 确实典型知乎标题, 重命名了.

emacs 一个优点 是它的文本处理能力。 它可以将一段普通的文本变成可操作。

比如说 dired 基本就是对ls -l 的输出结果进行解析后,以纯文本的格式在buffer中进行展示 进而

  1. 当你在某个文件名上按下回车,则直接打开相应的文件,
  2. 你可以在这个buffer中用你熟悉的命令进行搜索、过滤、
  3. 甚至使用wdired-mode(writable dired)编辑buffer里的部分文本(如文件名、权限)进而实现改名、改权限的目的

magit 也是一样,它将各种git 命令的输出结果 变成可操作的。 比如 说magit 的 ll 查看的git log : 基本是 git log --graph --decorate --pretty=oneline --abbrev-commit --all 的输出

  1. 你可以在log 中具体的某个commit 上按下回车 查 看具体某个commit 的变更
  2. 可以在某个commit 上按下bb: checkout 这个commit
  3. 可以直接reset/revert 某个commit
  4. 可以在log中选中一段region,然后回车, 对region 开始与结束位置的两个commit 进行diff

magit-log-buffer-file: 查看当前buffer的commit log记录 ,在 log mode 中M-x:magit-find-file 则可查看此文件此commit时的完整文件内容 当然我对 此封装了一个命令 实现以下功能:

(define-key magit-commit-section-map  [return] 'vmacs-magit-diff-range)

在magit-log-buffer-file 产生的log buffer中

  1. return : 查看当前commit 的diff
  2. 有选择区域 则查看区域内的diff
  3. C-u 则打开当前对应的版本的文件 vmacs/config/emacs/lazy/lazy-magit.el at master · jixiuf/vmacs · GitHub
(global-set-key (kbd "M-p") 'magit-blob-previous)
(global-set-key (kbd "M-n") 'magit-blob-next)

magit-blob-next/magit-blob-previous : (相当于 git-timemachine的功能) 则直接可以依次查看当前文件的历史变更

在git log mode 下 使用dc 查看具体某个commit 的diff时 可以通过 -b(Ignore whitespace changes) -w(Ignore all whitespace) 控制 是否忽略空格引起的变更 当然du 查看未提交的commit 的变更时 也可以使用-b -w 等选项.

我写了个toggle-diff-whitespace 用于在 magit-revision-mode/magit-mode 中一键控制 是否忽略空格的影响,对于golang 这种因gofmt 后造成大段变更的diff 很友好。

vmacs/config/emacs/lazy/lazy-magit.el at master · jixiuf/vmacs · GitHub

(define-key  magit-mode-map (kbd "C-c Gw") #'toggle-diff-whitespace) ;gw
(with-eval-after-load 'diff-mode
  (define-key  diff-mode-map (kbd "C-c Gw") #'toggle-diff-whitespace)) ;gw

你感觉到卡 应该是在windows上用emacs 造成的体验相对较差。

15 个赞

magit好太多了,完全碾压命令行和其他git gui工具

  • 首先不用自己敲命令;
  • 然后有提醒功能,所有子步骤、子参数都有命令提示,极大降低了git的学习成本
  • 在功能上又比其他的git gui工具强大很多
  • 可定制性强

你说的卡顿,用native-compile会好很多,命令行只是会有即时输出,magit会在后台组织好再刷新界面,时间是差不多的

2 个赞

不下结论哪个好用,我列几个 Magit 让我非常“享受”的几个功能,希望能打动你:

  1. magit-status 界面下可以直接选中代码区域进行 stage,非常符合直觉。使用 Git CLI 的话需要 git add -i
  2. magit-commit 可以让我直接在 Emacs 中编辑 COMMIT MESSAGE,而且自动列出 diff,也可以很方便地查看历史记录。使用 Git CLI 的话,即使设置 EDITOR 也免不了要弹出一个新的编辑器窗口。
  3. magit-cherry-donate:这个太好用了,可以选中某个区域的 commit 直接把它们嫁接到别的分支上,很适合在其他分支开发时想选中部分内容合入主线。
  4. magit-rebase:在 magit-status 界面完成复杂的 rebase,非常实用。
  5. magit-ignored-files:可以很方便地选择 private/global ignore。

总的来说 Magit 类似于 lazygit,更像是对 Git 的进一步封装,但是它的封装基本是“透明的”(得益于 Elisp 的扩展性),加上 Transient UI 的强大实用,从 Git CLI 过渡到 Magit 几乎毫无压力,甚至能让我从 Magit 封装的一些常见操作中掌握更多的 Git 最佳实践。

我原先使用 Vim 的时候也钟爱 Fugitive,现在使用 Emacs 便自然选择了 Magit,它们的特点都是将 Git 命令行和编辑器本身无缝结合了起来——写完代码,直接 C-c M-g s 然后 C-x M-g c c 编写 COMMIT MESSAGE,不需要反复在终端和编辑器之间切换,使得日常工作流更加完整顺畅。

当然,运行效率确实是 Magit 的硬伤,尤其是在远程编辑环境下。如果楼主觉得还是 CLI 更可靠、速度更快,那当然可以不使用 Magit。毕竟只是个工具,萝卜青菜各有所好。

8 个赞

卡有可能是 Windows 上使用导致的

除了Windows上卡,其他平台还好。Windows上git本身就不快

2 个赞

卡的话,和windows有关,magit 的优势就是定制性高和作为gui集成的git功能相较于其他的客户端多,全面

magit 也就在 Windows 上比较慢,在 macOS是有点慢,在 Linux 下快如闪电。

期待 magit 加入 Emacs Core,同时能支持 libgit2 从而提升性能就完美了。

2 个赞

最像 lazygit 的应该是 eaf-git GitHub - emacs-eaf/eaf-git: Fully multi-threaded git client for Emacs

magit 虽然很强大, 但是学习曲线太复杂, 它的组合性导致一些常用的git命令使用要人工记录一长串快捷键

3 个赞

其实我感觉完全不用记 :joy:,因为它的快捷键就是命令行下的参数,而且还会有个 Transient UI 弹出来提示你,有时候脑子抽了看一下提示就行了。

image

例如 magit-commit,不仅列出了常用的 git commit 的参数,而且还附带解释,感觉和命令行里用已经没差了,还少打很多字 :rofl:。下方 Edit HEAD 里的三个 action 对应的是常用的几个命令:

# extend
git commit --no-edit --amend
# reword
git commit --amend --only --allow-empty
# amend
git commit --amend

这些命令只要在 magit-status 界面下敲两个键就行了,或者在任意 git 管理的 buffer 下 C-c M-g c,非常方便。

Lazygit 依赖终端,我觉得还是跟 Git CLI 没差。Eaf-git 打算换 Linux 的时候试一下 :wink:

1 个赞

功能最全的应该是magit和gitui,都是跨平台的

1 个赞

题外话,Windows上的Emacs对文本内容加密功能支持还需要一番折腾,不如Linux版浑然天成

我其实是通过magit学到了git的很多操作方式。哈哈哈

1 个赞

我也是,很多命令的参数也是通过magit学到的,也没有觉得学习曲线很陡峭

1 个赞

我从一开始就用的magit,第一眼就意识到它更有交互性和更简洁。思维上已经习惯只考虑要做的是什么操作,而不是要打什么命令。之前我拿magit操作完,要告诉同学怎么重复操作时,我还得去log buffer里找真实的git命令(

2 个赞

magit 最大的成功之处是自然就会用,即使命令行不熟悉。要深入查看log也能学习到。总结起来就是入门容易,深入也不难。

3 个赞

最大的优势是统一工作环境, 你没必要在git 和 emacs 中来回切换了, 单纯比较两者谁更好用没意义

magit比那些git教程教我的命令多多了- - 遇到好奇的就按下 $ 看看是啥