Two differences I most often use (i.e. take advantage of) are:
- The former is about showing 0 or more matching refs, and not
matching anything is a perfectly normal condition, i.e.
$ git for-each-ref refs/heads/no-such
exits with status 0. The latter can be used with --verify to
check if one ref exists, on the other hand.
- The former takes the match-from-left-to-right pattern (similar to
the usual pathspec match), while the latter matches from the
tail.
$ git for-each-ref refs/heads/* ;# only one-level names
$ git for-each-ref refs/heads/** ;# catches both master and mh/path-max
$ git show-ref master ;# refs/heads/master, refs/remotes/origin/master,...