The post walks through a specific Git oddity that trips up shell scripts and humans alike: `--` normally means “stop parsing options,” but in many Git commands it already serves a different job, separating revisions from pathspecs. That leaves a hole when a branch or tag itself begins with `-`, which is why Git added the more explicit `--end-of-options` flag. The piece is not about a new feature so much as a forgotten one, and it shows how easy it is to write a command that looks correct yet still lets a revision name get parsed as an option.
People reading it mostly landed on the same conclusion: this is not an isolated paper cut. It is a symptom of Git’s layered command design, where the object model is powerful but the
CLI remains full of historical compromises. Several commenters filled in the likely backstory. Early Git needed a separator between revisions and paths more urgently than it needed the standard Unix end-of-options marker, so it reused `--` there and boxed itself in later. Others pointed out that this is why the extra flag matters in real code, not just contrived examples. If a repo host,
CI job, or wrapper script passes through user-controlled branch names or filenames, weird names are not a joke and can become an
injection surface. That pushed the conversation away from “just don’t do that” and toward “quote and delimit everything correctly.”
The broader mood was that Git works best as infrastructure, not as a human-facing CLI. People cited
Magit,
GUI clients, and newer tools like
Jujutsu and
Sapling as evidence that the underlying model is good enough, while the stock interface is what keeps biting users. A few also noted that `--end-of-options` is at least clear and discoverable once you know it exists. But nobody made the Git CLI sound elegant. The practical message was simple: if you shell out to Git, be precise about argument boundaries, and if you make humans use Git directly, expect the interface to keep leaking its history at them.