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 看起来是这样还是那样并不重要。)
为什么我得到这个补丁:
@@ -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 看起来是这样还是那样并不重要。)