git-diff 中的意外结果

Unexpected result in 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 提供一些额外的选项来实现这种行为?

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

在我们的特定情况下,唯一允许的指令是 "delete symbol" 和 "add symbol"(不允许 "move",但请参阅下文)。此外,我们不知道每个符号 的意思 ,但每个 "symbol" 是一个 源行 .

两个"symbols"是相同的当且仅当它们完全匹配,或者(打开某些行尾and/or white-space选项)匹配之后剥离一些物品(主要是白色 space 或马车 returns)。我们的工作是生成最少数量的 "delete" 和 "insert new" 命令。

您显示的差异有两个 "insert" 和一个 "delete"。 diff Git 产生的还有两个 "insert" 和一个 "delete"。据 Git 所知,这使它们相等。它选择哪一个只是通过比较矩阵选择几条"equal"回溯路径中的哪一条。

git blame 中的代码允许 允许移动的不同算法。允许移动时解决问题要困难得多,所以 git diff 只是不费吹灰之力。要在 git blame 中启用移动检测,请使用 -M.

git diff --patience 产生您期望的结果。该方法尽量不将未更改的行标记为已添加或已删除。它不是默认值,因为它在计算上很昂贵。 (当目的是生成一个稍后应用的补丁时,大多数时候 diff 看起来是这样还是那样并不重要。)