获取有关 git word-diff 合并行的信息

Posted

技术标签:

【中文标题】获取有关 git word-diff 合并行的信息【英文标题】:Get info about git word-diff merging lines 【发布时间】:2015-07-31 00:06:01 【问题描述】:

我正在尝试构建文件的逐行历史记录,但在使用 --word-diff 模式时,我在 git diff/git log... 命令中出现了奇怪的行为。它有时会合并一些行。

例如,如果旧版本的文件是:

r = ioctl(hdev->control, VHOST_SET_LOG_BASE,
    (uint64_t)(unsigned long)hdev->log);

它被转换为:

r = hdev->vhost_ops->vhost_call(hdev, VHOST_SET_LOG_BASE, hdev->log);

(这些行来自this项目,使用 GPL 许可证分发)

简单的 git diff 给了我正常的输出(删除了 2 行,添加了 1 行),但 git diff --word-diff 给了我这个:

r = [-ioctl(hdev->control,-]+hdev->vhost_ops->vhost_call(hdev,+
    VHOST_SET_LOG_BASE, [-(uint64_t)(unsigned long)hdev->log);-]hdev->log);

--word-diff=porcelain 模式下会发出相同的输出,这不是文本模式错误。

当我试图获取文件的逐行历史记录时,我的方法在这块 git log 上失败了。我看到git 实际上向我展示了人类可读的最佳差异,因为编辑后的两行变成了一行,但对于脚本来说并不明显。所以,

这种行为是有意的吗? (git 1.9.1) 如果是,有没有办法获得一些关于这些合并的额外输出(如果有,取消合并)?不是,如何通过其他方式找到它们?

【问题讨论】:

【参考方案1】:

这看起来像 --word-diff 应该做的。 Git 将文件拆分为单词(以“”作为分隔符)并显示最小的块。您可以看到您的行总是以空格分隔。

尝试将--word-diff-regex=<regex> 与endline 字符一起使用。

关于合并的信息:git blame 在这里可能有用。

【讨论】:

你的意思是把“[:space:]+\n”当作一个词来对待?据我了解,\n 作为单词部分被忽略。 我的意思是将 "[:space:]+\n" 视为单词分隔符。所以你的文件字符串将成为 git 的“单词”。 有什么用?我真的需要word-diff 并查找我使用标准(无--word-diff)模式的行。

以上是关于获取有关 git word-diff 合并行的信息的主要内容,如果未能解决你的问题,请参考以下文章

如何修改git已经提交的信息及合并多次提交

Git 进阶操作

违反约束时是不是可以获取行的值?

有人可以给我有关如何计算评论行的信息吗?

git分支合并撤销;git修改已push的commit信息; git 撤销操作;

用于合并 Excel 中与其他列中的信息匹配的行的单元格的宏