When git log is run without revs, it defaults to HEAD. That's well-documented. However, when paired with --ignore-missing, there's a behavior mismatch if all the provided revs are nonexistent. If you provide the revs on the command line, like "git log --ignore-missing nonexistent --" (the trailing -- is just to help git log know "nonexistent" isn't intended to be a path), you get no output and no error (exit code is 0). If you provide the revs via stdin, like "echo 'nonexistent' | git log --ignore-missing --stdin --", you get every commit reachable from HEAD. It appears the way --stdin processes input discards nonexistent commits before the machinery that decides whether you provided any revs or not runs, and so if every --stdin rev is discarded then you get the default HEAD. If you provide them via the command line, though, then it seems like they're discarded later and you don't get a default. I'm not sure whether this is intentional or not (certainly I don't see it anywhere in the git log documentation for --ignore-missing or --stdin), but it results in a behavior mismatch that's impossible to reconcile without requiring extra git processes. I can't always provide HEAD since, if multiple revs are supplied, if any revs exist then HEAD would not be included regardless of whether the revs were supplied via the command line or --stdin. I've confirmed this behavior as far back as Git 1.8.0 all the way up to 2.28.0, so it's by no means new. I can't recall seeing it come up on the list before, but that doesn't mean it hasn't. Is this a bug, or a feature? Best regards, Bryan Turner