When "git grep" is run with -P/--perl-regexp, it doesn't match ^ and $ at the beginning/end of the line. This is because PCRE normally matches ^ and $ at the beginning/end of the whole text, not for each line, and "git grep" passes a large chunk of text (possibly containing many lines) to pcre_exec() and then splits the text into lines.
This makes "git grep -P" behave differently from "git grep -E" and also from "grep -P" and "pcregrep":
$ cat file a b $ git grep --no-index -P '^ ' file $ git grep --no-index -E '^ ' file file: b $ grep -c -P '^ ' file b $ pcregrep -c '^ ' file b
Reported-by: Zbigniew Jędrzejewski-Szmek <firstname.lastname@example.org> Signed-off-by: Michał Kiedrowicz <email@example.com> Signed-off-by: Junio C Hamano <firstname.lastname@example.org>