Hi. I have some question about how diff works then give proposal: it will be very useful for each "symbol" store additional meta info as source line length. So in this case when git counter two equal sequence of commands it will do further comparison: Adds 23 chars deletes none VS adds 75 chars deletes 46 Actually I got this: @@ -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); Instead of expected: @@ -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) Details: http://stackoverflow.com/questions/40550751/unexpected-result-in-git-diff/40552165?noredirect=1#comment68648377_40552165