git/list[1] front-page[2] threads[3] people[4] search[5] about
 

Re: Itches with the current rev spec

From
Ramkumar Ramachandra <artagnon@gmail.com>
Date
Apr 29, 2013, 15:08 UTC
Message-ID
<CALkWK0=W_FxDwc3Tby=h90yc5i8UEuT7maERahFRDQU=hQ633g@mail.gmail.com>
In-Reply-To
<7v8v45vvuy.fsf@alter.siamese.dyndns.org>
Junio C Hamano wrote:
>  - If the UI language for "rebase" were designed following the
>    "composition using common elements like ranges and revisions"
>    school, it would have started from "rebase --onto=X A..B".

I think you're looking at the whole issue backwards from the way I look at it. Let's try to lay out some fundamental principles and build a representations on top of that:

1. All rev specs (those specified in revisions.txt) either emit a
single positive/ negative (^) commit or multiple positive/ negative
commits (where the ordering does not matter).
2. Fundamentally, all commands require single/ multiple commits to
operate on.  They might also require some additional information.

rebase requires three pieces of information: the commit onto which to replay, a list of commits to replay, and a refspec to update once the replaying is done.

log requires one piece of information: the list of commits.
diff requires two pieces of information: two commits to diff.
3. "Range" is not an inherent property of A..B or A...B.  There are no
"revision ranges".
4. Every command is free to interpret positive and negative commits as
it sees fit.  Since there is no ordering, it must never treat one
negative commit differently from another negative commit, or one
positive commit differently from another positive commit.
show takes a list of positive commits and shows all of them.

log will show all the commits reachable from positive commits, and exclude all the commits reachable from negative commits. Here, the "list of commits" are interpreted differently from the show case.

diff can either take two positive commits or one positive + one negative commit. In the latter case, it swaps the arguments and treats both as positive commits.

rebase can take one negative commit and one positive commit. The commits reachable from the positive commit, but not from the negative commit are replayed onto the negative commit. Now, we can use --onto= to override the commit onto which to replay. But the fundamental constraint remains: rebase _cannot_ make this --onto= parameter part of the normal rev spec (we only have two types of commits: positive and negative to which we can assign different meanings). --

This, I think, is the way forward. In any command, forcing the user to differentiate between the two commits only using argv[0] and argv[1] is just horrible (diff with two positive commits is the only necessary exception to this rule).

Further, what I think is of utmost importance is consistency. Inventing loose mnemonics like in the diff case is the road to insanity. All commands _must_ behave exactly the same way with all the different rev specs (or error out when the particular rev spec emits more commits than the command needs/ the wrong number of positive-negative commits).

What's more? I have a solution. A brand new revspec is the _only_ way to solve our problems without breaking consistency, or trading off terseness [Who wants to do git rebase --onto master $(git merge-base master topic)..topic every single time?]. I mentioned it on the other thread, but didn't get feedback :(

Previous: Junio C HamanoNext: Yann Dirson
Message 16 of 24 in “Itches with the current rev spec”
  1. Ramkumar RamachandraApr 25, 2013
  2. Ramkumar RamachandraApr 25, 2013
  3. Matthieu MoyApr 25, 2013
  4. Felipe ContrerasApr 25, 2013
  5. Ramkumar RamachandraApr 25, 2013
  6. Michael J GruberApr 29, 2013
  7. Andreas SchwabApr 25, 2013
  8. Ramkumar RamachandraApr 25, 2013
  9. Phil HordApr 25, 2013
  10. Yann DirsonApr 26, 2013
  11. Johannes SixtApr 26, 2013
  12. Ramkumar RamachandraApr 26, 2013
  13. Junio C HamanoApr 26, 2013
  14. Felipe ContrerasApr 26, 2013
  15. Junio C HamanoApr 26, 2013
  16. Ramkumar RamachandraApr 29, 2013
  17. Yann DirsonApr 29, 2013
  18. Junio C HamanoApr 29, 2013
  19. Ramkumar RamachandraApr 29, 2013
  20. Junio C HamanoApr 29, 2013
  21. Ramkumar RamachandraApr 29, 2013
  22. Ramkumar RamachandraApr 29, 2013
  23. Junio C HamanoApr 30, 2013
  24. Ramkumar RamachandraApr 29, 2013

Read the whole thread, see it on lore, or plain text.

$ cat FOOTERMessages come from the public archive at lore.kernel.org/git, fetched every hour. The front page is chosen and written each morning by an AI editor and can be wrong; the threads themselves are the record. About and API. For agents: an MCP server at https://gitlist.dev/mcp, and any thread, story or person page as Markdown by adding .md to its URL (or sending Accept: text/markdown). Details in /llms.txt.