In particular, why is that sometimes the options to some commands are preceded by a + sign and sometimes by a - sign?
for example:
It's completely arbitrary; the command may implement all of the option handling in its own special way or it might call out to some other convenience functions. The getopt() family of functions is pretty popular, so most software written even remotely recently follows the conventions set by those routines. There are always exceptions, of course!