在Git中使用备用diff算法

时间:2011-05-14 02:46:38

标签: git diff

由于git是针对源代码设计的,因此其默认diff算法将行视为最小不可分割单位。

我正在尝试编辑一些包含在第80列自动换行的降价文件。添加句子可能会导致段落的其余部分被标记为已更改。

有没有办法让Git使用更适合文本的diff算法?我需要一个将单词或句子视为不可分割单位而不是行的单词吗?

3 个答案:

答案 0 :(得分:21)

您可以尝试使用git diff --word-diff

$ git diff --word-diff
diff --git a/test.txt b/test.txt
index 54585bb..a8cd97e 100644
--- a/test.txt
+++ b/test.txt
@@ -1,7 +1,7 @@
Because git is designed for source code, its diff algorithms {+are bibbity +}
{+bobbity boo+} treat a line as the minimum indivisible unit. I am trying to edit 
some markdown files that are word wrapped at column 80. Adding a sentence can 
cause the rest of the paragraph to be marked as changed.

Is there a way to have Git use a diff algorithm more suited to text? One that 
treats words or sentences as indivisible units rather then lines?
 No newline at end of file

答案 1 :(得分:11)

也许您正在寻找word-diff

  

- word-diff [= <mode>]

     

使用<mode>来显示单词diff   划定改变了的词。默认情况下,   单词由空格分隔;看到   --word-diff-regex如下。 <mode>默认为plain,必须是以下之一:

     

颜色

     

仅使用突出显示更改的单词   颜色。意味着 - 颜色。

     

普通

     

将单词显示为[-removed-]和   {添加}。没有企图逃脱   分隔符,如果它们出现在   输入,所以输出可能不明确。

     瓷器

     

使用特殊的基于行的格式   用于脚本消费。   添加/删除/未更改的运行   以通常的统一差异打印   格式,以+ / - / 开头   线条开头的字符   并延伸到行尾。   表示输入中的换行符   通过波浪线〜在自己的线上。

     

     

再次禁用字差异。

     

请注意,尽管名称如此   第一种模式,颜色用于突出显示   所有模式中的更改部件如果   启用。

http://git-scm.com/docs/git-diff

答案 2 :(得分:7)

以下是自定义此内容的示例(来自this question)。默认情况下,--word-diff假定一个单词是一个非空白字符串。以下命令将考虑包含以下内容之一的单词:

  1. 一串字母数字字符和下划线
  2. 单个非字符
  3. 命令:

    git diff --color-words --word-diff-regex='[A-z0-9_]+|[^[:space:]]'