git-diff中的意外结果

时间:2016-11-11 15:05:49

标签: git git-diff

为什么我会得到这个补丁:

@@ -129,8 +132,9 @@ sub _preprocess_message {
 sub _process_message {
     my ($self, $message) = @_;

-    my $method = ref($message) eq 'HASH' ? $message->{method} : undef;
+    my $time =  [ gettimeofday ];

+    my $method = ref($message) eq 'HASH' ? $message->{method} : undef;
     return $self->send_error(ERROR_REQUEST_INVALID)
         unless defined($method);

my $method = ...后删除空行:

@@ -129,6 +132,8 @@ sub _preprocess_message {
 sub _process_message {
     my ($self, $message) = @_;

+    my $time =  [ gettimeofday ];
+
     my $method = ref($message) eq 'HASH' ? $message->{method} : undef;

     return $self->send_error(ERROR_REQUEST_INVALID)

我希望看到这个补丁而不是第一个:

@@ -129,6 +132,8 @@ sub _preprocess_message {
 sub _process_message {
     my ($self, $message) = @_;

+    my $time =  [ gettimeofday ];
+
     my $method = ref($message) eq 'HASH' ? $message->{method} : undef;
-     
     return $self->send_error(ERROR_REQUEST_INVALID)

my $method = ref($message) eq 'HASH' ? $message->{method} : undef;根本没有改变:空白没有变化,EOL相同

我可能应该为git提供一些额外的选项以获得此行为吗?

2 个答案:

答案 0 :(得分:3)

Git的diff实现了通用最小编辑距离字符串到字符串编辑问题的特定变体。我们给出了一些初始符号集和一些最终集,我们被告知从一些有限的编辑命令中得出最少的编辑指令。

在我们的特定情况下,唯一允许的指令是"删除符号"和"添加符号" (没有"移动"允许,但见下文)。此外,我们不知道每个符号的含义,但每个符号"符号"是源代码行

两个"符号"当且仅当它们完全匹配时,或者(在打开某些行尾和/或空格选项时)匹配一些物品(主要是空格或回车)之后匹配是相同的。我们的工作是产生最少数量的"删除"和"插入新的"命令。

你展示的差异有两个"插入" s和一个"删除"。 diff Git产生的还有两个" insert" s和一个" delete"。就Git所知,这使它们相等。它所选择的只是几个“平等”的问题。它通过比较矩阵选择的追溯路径。

git blame中的代码允许 允许移动的其他算法。允许移动时解决问题要困难得多,因此git diff不会烦恼。要在git blame中启用移动检测,请使用-M

答案 1 :(得分:1)

git diff --patience会产生您期望的结果。该方法努力不将行标记为在未更改时添加或删除。它不是默认值,因为它的计算成本很高。 (当目的是生成稍后应用的补丁时,大多数时候,差异是否看起来都是无关紧要的。)