如何在文本编辑器中查看git diff?

hivapdat  于 2022-12-21  发布在  Git
关注(0)|答案(5)|浏览(291)

如何在Atom这样的文本编辑器中查看git diff?我不想设置或使用diff工具,我只想在任何基本的文本编辑器中查看diff。
我看到的其他问题的答案谈到了设置一个比较工具,但我只是想指定一些随机文本编辑器。
附带问题:

  • 比较工具和任何文本编辑器有什么区别?
0g0grzrc

0g0grzrc1#

如何在Atom这样的文本编辑器中查看git diff?我不想设置或使用diff工具,我只想在任何基本的文本编辑器中查看diff。
Diff输出只是文本,因此您可以将其重定向到一个文件并打开该文件,或者(取决于编辑器和平台)将输入直接通过管道传输到编辑器。
如果你确实想把编辑器作为diff工具运行,the documentation描述了如何调用编辑器,你可能想用一个 Package 器脚本在命令行的正确位置调用环境变量的atom。
附带问题:比较工具和任何文本编辑器有什么区别?
一个通用的文本编辑器不可能像一个专用的工具那样显示的那么好,至少,如果它能识别格式,它可以突出显示特定于差异的部分。
一个真正的比较工具通常会让你有机会看到文件的新旧版本,以及直观地显示更改的位置。它也可以突出显示行内的更改(比较本身是基于行的)。
我一般反对图文并茂,但既然我们真的在讨论界面...
1.在文本编辑器中打开git diff的输出:

这与在终端读取diff没有什么不同,所以我看不出有什么好处,它确实突出显示了 * index * 行,但只有当我在一个diff中扫描多个块时才真正有用。
1.显示相同变更的GVim逃逸插件:

这是我的编辑器内的视图,带有vescent插件。你可以看到我从join行中删除了一个空格的行内高亮显示。如果我继续在右窗格中输入,它甚至会实时更新。这也是唯一一个语法正确的高亮显示源代码的视图。
1.在meld中打开的相同更改git difftool

这是一个更改如何适应整个文件IMO的最友好视图。

t98cgbkg

t98cgbkg2#

TL;DR:Git本身并不知道其他命令,所以你必须提供一组辅助指令 * 给 * Git,告诉它:* 要使用程序X作为一个比较工具,请执行_____*。你最好的选择是找到已经被别人构造的指令,就像在他自己的答案中添加的注解EncryptedWatermelon一样,但是如果做不到这一点,那么请参见下文。
请参阅Useless's answer了解一些实用技巧。
请注意,就Git本身而言,尽可能简单地说,diff 意味着 * 比较两个修订版 *。例如,两个修订版可以是两个提交,也可以是一个提交和工作树内容。Git有一些额外的特殊情况,因此您也可以将其用作标准Unix/Linux diff命令的更好版本,但大多数情况下,它是两个修订版。其中每一个都是一整套文件:

  • 如果左侧版本号有一个名为 F 的文件,右侧版本号有一个名为 F 的文件,Git会比较两个版本的 F 的内容。
  • 如果左侧有一个文件 D,而右侧修订版中没有,则文件 D 已被删除。
  • 如果左侧没有文件 A,但右侧修订中有文件 A,则文件 A 已被 * 添加 *。
  • 如果你启用了重命名检测(这是Git 2.9版的默认设置),Git会在添加和删除文件时,尝试查看新添加的文件是否与旧的但已删除的文件基本相同,如果是,则将其报告为一个 renamed 文件。使用旧名称 D(已删除)和新名称 A(已添加)。Git接着继续比较左侧 D 和右侧 A 的内容。
  • 当比较文件的内容时,如果所有内容都相同,Git通常就什么都不说,否则,你可以让Git给予你一系列的指令,比如“删除这一行”和/或“添加这一行”。2按照这些指令操作会把旧版本的文件转换成新版本的文件。3这些指令不一定是任何人实际上做的!他们只会“得到同样的结果”(通常只有一种显而易见的方法可以得到结果,所以这就是某人所做的)。

考虑到这一点,下面是git difftool的工作:

  • 首先,它让Git比较两个版本号以生成一个有变化的文件列表,同时 * 抑制 * 这些文件的实际比较。
  • 然后,利用已改变文件的列表-在两个修订中存在但在两个修订中不匹配的名称集合 F-它制作文件的左侧修订版本的副本,以及右侧修订版本的副本。在大多数情况下,Git必须创建这些副本,因为存储在Git中的文件是以冻结和压缩的形式保存的,只有Git可以真正读取。Git必须解压缩/解冻它们,“再水合”文件的内部冻干形式,以便其他程序可以读取它。

在少数情况下,比如当比较一个特定的提交和工作树时,它 * 可能 * 只是在适当的时候使用工作树副本,它仍然可以制作自己的副本,你在这里没有得到任何实际的承诺。

  • 现在文件有了两个副本,Git使用一个辅助程序来启动你选择的diff工具。这个辅助程序会提供一些信息,比如:
  • 每个临时副本的名称
  • 文件的原始名称(例如,临时副本通常有一些丑陋的临时名称,如.tmp-123456

助手程序的任务是运行diff工具,使其以用户友好的方式显示这些文件,然后等待diff工具指示用户已经完成查看文件,并找出用户是否表示希望取消查看文件,或者继续查看下一个文件对。
This is the helper program.这是一个相对简单的shell脚本,只有100多行,但它使用了更多的shell脚本:特别是它使用了this larger mergetool helper library,它的shell脚本代码超过450行。
要提供您自己的工具,您必须(无论如何都要达到最佳使用效果)编写第二个(合并助手)库使用的shell脚本,以及提供有关如何运行所选工具的知识的第一个脚本。此交互的关键元素包括:

  • 打开这两个文件
  • 显示比.tmpwhatever更有用的名称
  • 检测用户何时以及是否想要继续到下一个DIFF或退出。

现有的两个shell脚本助手库都有一些后备功能,所以如果你的程序相对简单,现有的助手可以自己运行它。它们只需要知道 * 可执行文件在哪里,传递什么参数 * 以及 * 是否信任它的退出代码 *。你可以通过设置difftool.*name*.cmdmergetool.*name*.trustExitCode来设置git config。例如:

git config --global difftool.foo.cmd '<path> "$LOCAL" "$REMOTE"'
git config --global mergetool.foo.trustExitCode true

还可以(但不是那么好:文件名将是怪异和无用的),如果在 * path * 的命令对于“继续到下一个diff”退出零并且对于“现在退出”退出非零。

wz8daaqr

wz8daaqr3#

git diff将显示在你的控制台如果这输出是短的,否则它将到你的寻呼机.即lessmore
git difftool将显示在tkdiff,xxdiff,meld,比较gvimdiff,...或任何你设置
Difftools通常允许您在页导航为只读时编辑文件

c90pui9n

c90pui9n4#

比较工具(例如:http://meldmerge.org/)将在2、3甚至4个面板(您的版本、远程版本、合并版本、祖先版本)中显示差异。
在文本编辑器上打开diff(这是我的偏好)会显示diff特殊字符,指示内容的添加、删除和修改,以及一些上下文边界信息。

cgyqldqp

cgyqldqp5#

您还有since Git v1.7.8 (Oct. 2011) git jump

    • git jump**是一个脚本,用于帮助您在编辑器中跳转到项目的"有趣"部分。

它的工作原理是以"quickfix"格式输出一组有趣的点,像vim这样的编辑器可以将其用作访问位置的队列(这个特性通常用于跳转到编译器产生的错误)。
例如,给定一个如下的diff:

------------------------------------
diff --git a/foo.c b/foo.c
index a655540..5a59044 100644
--- a/foo.c
+++ b/foo.c
@@ -1,3 +1,3 @@
int main(void) {
-  printf("hello word!\n");
+  printf("hello world!\n");
}
-----------------------------------

git jump会将此内容提供给编辑器:

-----------------------------------
foo.c:2: printf("hello word!\n");
-----------------------------------

请务必使用Git 2.35(2022年第一季度):git jump(在contrib/中)的"merge"子命令忽略了路径规范和其他参数。
参见Jeff King ( peff )commit 67ba13e(2021年11月9日)。
(由Junio C Hamano -- gitster --合并到commit a0f3df5,2021年12月10日)

git-jump:将"merge"参数传递给ls-files

签署人:杰夫·金
当前我们会丢弃所有给git jump merge "的参数。
我们应该将它们传递给ls-files,因为它们很可能是路径规范。
这与git jump diff等的行为相匹配。
在Git 2.40(2023年第一季度)中,git jump(在contrib/中)学会了将"quickfix list"表示为标准输出(而不是让它被它调用的编辑器使用),并学会了驱动emacs/emacsclient。
参见Jeff King ( peff )commit 64685cb(2022年11月27日)。
参见commit 9508dfdcommit cfb7b3b(2022年11月27日)和Yoichi Nakayama ( yoichi )
(由Junio C Hamano -- gitster --合并至commit 06ae40f,2022年12月14日)

git-jump:添加可选参数"--stdout"

签署人:中山洋一
它可以与Emacs上的M-x grep一起使用。
即:
M-x × 1米21英寸
<RET>
git jump --stdout diff
<RET>

相关问题