for a better control of the git execution, it's better to define a builder-like interface to control options.

This allows us to run a command like "git whatchanged ^rev1 ^rev2 ^rev3 ... revN".

Compared to "rev1...revN" "rev2...revN" "rev3...revN" that the current GitSCM plugin does, this is both more efficient (because it's only one invocation) and more accurate (because A..C && B..C can report the same commit twice: imagine the commit graph A<-B<-C.)
Better to be an abstract class for reuse between impls
Since changelog produces a text, it needs to take Writer.

Otherwise there's no guarantee what encoding the log gets written in.

(this makes me wonder if git says anything about the encoding of the commit message. Is it platform dependent, or is it supposed to be a fixed encoding like UTF-8?)