54

假设我在我的 git 存储库中对未耦合的文件进行了许多不相关的更改。我想分别审查和提交每个文件。

我运行magit-status,并获取已更改文件的列表。但我能找到的唯一 magit diff 命令(dD)区分整个修订,而不是单个文件。

我想要git diff <filename>, 但在 magit diff 缓冲区中的输出。我怎样才能让 magit 只区分一个文件?

4

3 回答 3

100

Magit 使您能够直接从magit-status缓冲区“分别查看和提交每个文件”,而无需任何单独的差异缓冲区。

您只需展开您感兴趣的文件(使用TAB,它会向您显示该文件的差异);然后您可以将要提交的部分(整个文件,或单个大块,甚至标记的区域)暂存到暂存s(或u取消暂存)。对该提交中涉及的所有更改重复此操作,一旦所有必要的内容都已上演,请按c开始提交。

您可能更喜欢通过使用(重复)获得的可见性循环C-TAB行为,而不是默认情况下使用TAB.


如果您确实想在单独的缓冲区中查看文件的差异,您可以通过直接调用文件的缓冲区或magit-diff-buffer-file使用. 例如:dmagit-file-popup

(global-set-key (kbd "C-c m d") 'magit-diff-buffer-file)
(global-set-key (kbd "C-c m f") 'magit-file-popup)

另请注意以下@assem 的评论:

您可能还对默认magit-ediff绑定到哪个感兴趣e,并在此时为 diff/file 打开一个 ediff 会话。


默认情况下,Emacs 中可用的其他一些替代方案(即不是 Magit)是:

  • C-xv=打电话vc-diff
  • M-x vc-ediff对于 ediff 等价物
  • M-x ediff-revision创建具有更多选项的 ediff 会话

我绑定vc-ediff到,C-xvC-=以便这两个变体具有相似的键绑定。

于 2013-07-23T00:16:01.217 回答
24

我建议观看magit 的创建者的视频。这是 20 分钟,它向您展示了预期的工作流程。

此外,还有一个小提示:您可以使用它1 2 3来更改当前标题的 diff 详细程度。

另一个小提示:如果您对大块的大小不满意,您可以通过 -没错- 标记一个区域并按下来展示任意区域s。这是魔法。我有一段时间不知道这个选项,我实际上是回到控制台并git add -p以老式的方式进行操作。

于 2013-07-23T06:30:44.447 回答
3

使用工具时不违背规则肯定有好处,正如其他答案所例证的那样。

另一方面,有时你只想告诉你的编辑该做什么,让互联网上的人回答你的问题,而不是告诉你想做其他事情。

magit提供了一个菜单界面,通过M-x magit-file-popup. 您需要从这里按下的键是“du”。这对您来说可能按键太多,如果是这种情况,您可以magit-diff像这样直接调用:

(defun magit-diff-given-file (&optional file)
  (interactive)
  (unless file
    (setf file buffer-file-name))
  (magit-diff-working-tree "HEAD" nil (list (file-relative-name file (magit-toplevel file)))))

您可能想为此定义自己的函数和键绑定。

magit-diff有优势,vc-diff因为 if 允许您跳转到 diff 的位置。

于 2016-11-29T04:14:51.343 回答