Remix.run Logo
git's –end-of-options Flag(nesbitt.io)
149 points by Erenay09 2 days ago | 60 comments
metadat 6 hours ago | parent | next [-]

Does anyone know why git broke the long standing convention of "--" early on? Kind of a nightmare for humans to use.

Remembering app-specific one-offs is kind of the worst!

doctoboggan 6 hours ago | parent | next [-]

git's data model is incredibly powerful and flexible, but its UX is famously... interesting:

https://stevelosh.com/blog/2013/04/git-koans/

ulrikrasmussen 32 minutes ago | parent | next [-]

I use git every day and can do quite advanced stuff with it, but I do all of my work using magit in emacs. I don't even use emacs for writing code anymore, I only use it for git. I just can't be bothered with using the CLI, it is too painfully inconsistent.

The only downside to this is that it is hard for me to help people with git problems since I can only tell them what conceptually has to be done, not how to accomplish it using the CLI.

ffsm8 3 hours ago | parent | prev | next [-]

It's always such a good experience to read well written articles like this from the early 2010s when our industry was a lot less self-important

Especially because the text is actually written by a human, and it's clear from every sentence

dc3k 3 hours ago | parent [-]

I also appreciated that the site didn’t give me a popup asking me to sign up to its newsletter.

Bugg4 2 hours ago | parent | prev | next [-]

The hobgoblin one sent me

pydry 2 hours ago | parent | prev | next [-]

iirc Linus actually conceded this very early on and said that he thought it would be better if it were used as infrastructure to build tools on rather than the tool itself.

no idea where I saw that though and it was many many years ago.

edelbitter an hour ago | parent [-]

In any case, the refined version of that admission - the deliberate porcelain/plumbing distinction - is still best explained in the git docs and I wish more tools would copy it. apt(-get) has cautiously started that process, while GnuPG sadly remains a box shock full of surprises in both API and CLI.

peheje 3 hours ago | parent | prev [-]

These are great

andy99 3 hours ago | parent [-]

I don’t understand any of them. Normally even when I’m not really familiar with a tool, I have enough background knowledge to understand why it’s funny e.g. Scheme and Haskell jokes or something. I do use basic git regularly and all of this is over my head. I don’t know if that speaks to how complicated and unintuitive some of the advanced stuff is?

jibal 2 hours ago | parent [-]

The context here is the statement that "its UX is famously... interesting". You don't have to understand anything other than how wildly inconsistent the git CLI is.

userbinator 4 hours ago | parent | prev | next [-]

The Single UNIX Specification mentions the "--" convention in 1997 (at which point it was already in widespread use): https://pubs.opengroup.org/onlinepubs/7908799/xbd/utilconv.h...

The first release of git was in 2005, and Torvalds' Linux was clearly UNIX-inspired, so it's not like this was due to considerations for some other OS like DOS/Windows.

j16sdiz 4 hours ago | parent [-]

The practice was there before the spec

setopt 4 hours ago | parent [-]

Which the parent poster said in their comment?

dmurray 3 hours ago | parent | prev | next [-]

It sounds like they didn't need (at the time) to separate arguments from options, but they did need to separate revisions from pathspecs. So they repurposed "--" as the most familiar separator.

Probably they were trying to use familiar conventions, but when they later needed to separate arguments from options, that was a closer match for what other people were using "--" for, but it was too late.

stingraycharles 2 hours ago | parent [-]

So basically don’t break conventions by repurposing existing operators for something else.

It’s silly as git is otherwise a very elegantly designed application, and you’d expect it to be developed by people who are very accustomed to these conventions.

epistasis 5 hours ago | parent | prev | next [-]

Since it separates out the pathspec, doesn't that match the long standing convention?

jibal 2 hours ago | parent [-]

The convention is that a leading `-` isn't recognized as a flag after `--`.

p-e-w 6 hours ago | parent | prev | next [-]

When something appears to be poorly designed, then the deeper explanation is often that it’s indeed poorly designed.

vips7L 3 hours ago | parent | prev | next [-]

Flags for Unix tools have never been friendly.

VBprogrammer an hour ago | parent [-]

Find is a great example. It's such a useful and powerful tool but it's arguments get me on a regular basis.

TZubiri 4 hours ago | parent | prev [-]

One of the undeniable benefits of LLMs is that the end of guessing and remembering commands is now optional.

Now we can all run important CLI programs like Zork without a 'command doesn't exist' to command ratio of 1:4

xg15 4 hours ago | parent [-]

Yeah, now the LLMs are guessing the commands...

bombcar an hour ago | parent | prev | next [-]

This is actually one of the few places powershell begins to do something close to shine - the cli mixes data and commands in a way that we really shouldn't have to do.

The saddest thing is even ASCII has characters to help with this but since keyboards can't type them nobody used them.

yobert 6 hours ago | parent | prev | next [-]

So I should name my next branch ‘--‘ is what I'm hearing :)

bradley13 5 hours ago | parent | prev | next [-]

As with almost any successful system: more and more special features and edge cases get added. Git has become ridiculously complex.

I wonder: would it not be better to tell users with those edge cases to fix their problems some other way? To take an example from the article: why does someone have a filename beginning with a dash? Maybe don't do that.

zanecodes 5 hours ago | parent | next [-]

Sometimes you're using git in a context where you don't control the filenames, or where a potential attacker could influence or fully control them, at which point edge cases like this can easily turn into exploits.

I also chafe whenever I run into artificial restrictions on things like characters in names of things, because there's no good reason for them besides the laziness of developers or the limitations and inertia of existing systems that might be used under the hood, like DNS for instance.

vips7L 3 hours ago | parent [-]

An attacker has access to your git??? You’re fucked. Give up.

kangalioo 2 hours ago | parent [-]

Every git repository hosting platform - GitHub, GitLab, Bitbucket, Codeberg - necessarily gives end users control over filenames.

"User-controlled strings as parameters" is not "access to your git" but it is still an attack vector.

eviks 2 hours ago | parent | prev | next [-]

> why does someone have a filename beginning with a dash? Maybe don't do tha

Oh, the famous "you're holding it wrong". For one, that's a ridiculous limitation to place on the user, that's a pretty basic symbol, but also imagine someone else did that and you can't change it because it's outside of your control

windward an hour ago | parent | prev | next [-]

It's from 2019, so it's hardly a recent development.

It's also very discoverable if you see it in the wild. You may be surprised that `--` doesn't work, but you won't be surprised `--end-of-options` represents the end of options.

What problem does this actually cause you? What additional complexity has adding this feature added to your development cycle?

reaperducer 2 hours ago | parent | prev [-]

why does someone have a filename beginning with a dash?

Because it's my computer, not yours, and I'll do what I want with it?

Chinjut 5 hours ago | parent | prev | next [-]

The "Everything is text, do everything via text" philosophy has its advantages, and also its disadvantages.

usr1106 5 hours ago | parent | next [-]

Like the von Neumann architecture. Your data can be misused as code.

Don't see that we get rid of either command lines in text or von Neumann any time soon.

eviks 2 hours ago | parent | prev [-]

What are the advantages over structured text?

majewsky 2 hours ago | parent [-]

Access to a well-established set of tools for operating on unstructured text (coreutils, grep, sed, awk, etc.).

eviks 2 hours ago | parent [-]

That's not the benefit of text, just adoption. All these tools could've just as well grown to be popular with a proper format, and your point would be exactly the same

gritzko an hour ago | parent | prev | next [-]

The only correct way to use git CLI is not to use it at all. All the hardcore revision control machinery must be in a C or Rust library, all the porcelain must be malleable scripts (readable, editable, customizable, extendable, reusable) [1]

You can not beat the expressive power of good old JavaScript or LISP by invoking convoluted non-standard CLI spells.

Can you pipe one git command into another? It is not even UNIX way.

[1]: That is how I do it and it works.

epistasis 5 hours ago | parent | prev | next [-]

Perhaps I'm missing something (it's been a long day), but couldn't "--" be used for both?

    git cmd --options -- rev -- pathspec
would be the fully specified revspec and pathspec

    git cmd --option -- rev --
would be just the revspec, excluding accidental options, without a pathspec

    git cmd --option revspec -- pathspec
and the single "--" would work as it currently does.
gene91 5 hours ago | parent [-]

Currently, git log -- a -- prints all commits that affects the files whose name is a or two dashes.

xyzsparetimexyz 3 hours ago | parent | prev | next [-]

What a mess. Just use jj instead.

_blk 6 hours ago | parent | prev | next [-]

> git log --end-of-options "$rev" -- "$path",

Argh, that's when I wished for object oriented shells. Powershell sure isn't perfect but objects encoding their own meaning really helps differentiate those cases (but it may not always help the user if types aren't clear to the reader)

eru 6 hours ago | parent [-]

I don't think you need object orientation for that. Haskell and Rust solve these problems also just fine, without any OOP in sight.

desmaraisp 5 hours ago | parent | next [-]

In this specific case, the oop nature of powershell doesn't actually matter, just the fact it uses structured input instead of raw string.

It's like passing a struct to a function instead of a badly serialized representation of a value

_blk 5 hours ago | parent | prev [-]

Hmm, not sure I understand. How are those shell based?

I agree that rust and haskell are not your typical OO (or not OO at all in a traditional sense) I guess my poorly worded claim was less focused on the OO nature of psh than on the typization (which both of these also do) - if you knew what type $rev and $path are, it's easier to distinguish intent, whether objects or not.

eru 3 hours ago | parent [-]

> Hmm, not sure I understand. How are those shell based?

A shell is just a programming language that's well suited for interactive repl use. Compare https://en.wikipedia.org/wiki/Scsh

Of course, Rust and Haskell aren't typically thought of as shells. Though if you wanted to and felt brave enough, you could use ghci as a shell.

> I guess my poorly worded claim was less focused on the OO nature of psh than on the typization (which both of these also do) - if you knew what type $rev and $path are, it's easier to distinguish intent, whether objects or not.

Agreed!

ButlerianJihad 5 hours ago | parent | prev | next [-]

https://m.xkcd.com/1597/

By the way, something munched the article title. An endash is incorrect command-line usage. It’s supposed to be a double hyphen.

sheept 4 hours ago | parent | next [-]

It is an en dash, not an em dash, since it's about as wide as an n.

Some software substitutes a double hyphen -- with an en dash rather than em, and use the triple hyphen --- for the em dash. Perhaps Hacker News' title formatter is one of them.

ButlerianJihad 4 hours ago | parent [-]

Okay, edit submitted, but that is extra weird, because the double hyphen is a convention or placeholder for an emdash. When a transformation takes place, it becomes an emdash.

There is no reason to transform it to an endash. I don't know any software that would do that. Checked with an LLM, too. That makes no sense at all!

dasyatidprime 4 hours ago | parent | next [-]

TeX uses -- (double hyphen) for producing an en dash and --- (triple hyphen) for an em dash, and that's pretty darn longstanding and well-established. And FWIW, the English writing conventions that I learned use em dashes as punctuation without an adjoining space—like this—but allow en dashes surrounded by spaces as an alternative – like this – so I frequently see spaced double hyphen used as the ASCII equivalent of dash punctuation and interpret it as the latter. I've never personally heard of double hyphen for em specifically, only either as en specifically or as a sort of ambiguous whatever-dash.

chowells 4 hours ago | parent [-]

Double dash -> emdash is a default autoreplacement in OSX. That's why a lot of people think it's the default everywhere.

cubefox 4 hours ago | parent | prev | next [-]

Then how do you type in an en dash instead? Also, according to LLMs, the en dash is used in far more languages than the em dash. Many languages don't use the em dash at all. Using the em dash for sentence interruptions seems to be specifically an US American English tradition: Most languages which use dashes for sentence interruptions use spaced en dashes instead.

noisem4ker an hour ago | parent | next [-]

> how do you type in an en dash instead?

By pressing the "-" key for half a second and choosing the exact dash character I am looking for in the pop-up that shows near the caret.

KDE Plasma: Press-and-Hold for Alternative Characters https://blogs.kde.org/2026/03/14/this-week-in-plasma-press-a...

Sharlin 2 hours ago | parent | prev [-]

I get en dash with alt+- and em dash with alt+shift+-. One of the niceties of the macOS keyboard layouts. There’s also the ellipsis and middot among other things.

reaperducer 2 hours ago | parent | prev [-]

because the double hyphen is a convention or placeholder for an emdash

A /more recent/ convention.

My memory of early Associated Press computer systems is that two dashes is the endash (or "nutt") and three dashes is the emdash ("mutt").

wafflemaker 5 hours ago | parent | prev | next [-]

From the title I've learned that git uses an em-dash instead of double dash as options delimiter. Thanks for pointing out that the title was wrong -- I've never had a need to use -- with git, so didn't know that it doesn't work.

ButlerianJihad 5 hours ago | parent [-]

I'm sorry, you've learned what now?

Erenay09 5 hours ago | parent | prev [-]

I'm sure I typed double-hyphen when submitting the post, but probably HN auto-formatted the title. IDK really.

usr1106 4 hours ago | parent | prev [-]

Copilot CLI (we get that at work) often uses slightly low-level and cryptic git commands. Never noticed that it would use --end-of-options though.

Should check what it does with branch names starting with a dash.

Of course that wouldn't be a security vulnerability, but a user error. It asks user approvals to execute those things and has disclaimers to check results. Which of course every user does all the time... /s

vips7L 3 hours ago | parent [-]

Absolute another level of lazy if you need an LLM to git for you.