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

Re: [PATCH 1/2] revision: Denote root commits with '#'

From
Junio C Hamano <gitster@pobox.com>
Date
Jan 18, 2021, 19:15 UTC
Message-ID
<xmqqwnwajbuj.fsf@gitster.c.googlers.com>
In-Reply-To
<e0264a29-2112-f8c8-f066-2be445654d8e@pdinc.us>
Kyle Marek <kmarek@pdinc.us> writes:
> I'll investigate the revision-mark shifting idea. I am concerned that
> it would get complicated if a graph edge extends around a revision
> that needs to be shifted,...

The "current graph layout makes it harder to see where the root is" problem has a natural solution: fix the graph layout so that the root is easily visible.

I however think it is a much harder approach to solve than using a different mark for root commits, and it is the reason why there have been at least a few attempts in the past that did essentially the same patch as yours, plus the "linear break" which we accepted.

Show 29 quoted lines
> *   8d82d0a (HEAD -> master) Merge branch 'o1'
> |\
> | * 3479914 (o1) O1
> | * a674e07 O1        <-- root commit
> | * 2237b52 (t) T
> | * f525fa5 T
> |/
> * f15f936 A
> | * 9e289ed (u) U
> |/
> * ee911c8 initial     <-- root commit
>
> vs:
>
> *   8ee9b14 (HEAD -> master) Merge branch 'u'
> |\
> | * ed1990f (u) U
> * |   277f31c Merge branch 'o1'
> |\ \
> | * | eaa71bb (o1) O1
> | * | 9203a43 O1      <-- root commit
> |  /
> | | * bc2c4d9 (t) T
> | | * 2d3c03b T
> | |/
> |/|
> * | 6a26183 A
> |/
> * da85ccf initial     <-- root commit

Sorry, I am not quite sure what you are trying to illustrate with the comparison between the above two. The latter makes it clear that 9203a43 and da85ccf do not have parents in the depicted part of the history [*1*].

In the former one, does 2237b52 have no child in the depicted part of the history, and is the problem that it appears as if it has a674e07 as a child? I wonder if we can just shift them, either:

Show 8 quoted lines
> *   8d82d0a (HEAD -> master) Merge branch 'o1'
> |\__
> |   * 3479914 (o1) O1
> |   * a674e07 O1        <-- root commit
> | * 2237b52 (t) T
> | * f525fa5 T
> |/
> * f15f936 A
or
Show 8 quoted lines
> *   8d82d0a (HEAD -> master) Merge branch 'o1'
> |\
> | * 3479914 (o1) O1
> | * a674e07 O1        <-- root commit
> |   * 2237b52 (t) T
> | __* f525fa5 T
> |/
> * f15f936 A

Or we could punt to show it with an extra blank line, although it is suboptimial.

Show 9 quoted lines
> *   8d82d0a (HEAD -> master) Merge branch 'o1'
> |\
> | * 3479914 (o1) O1
> | * a674e07 O1        <-- root commit
> |
> | * 2237b52 (t) T
> | * f525fa5 T
> |/
> * f15f936 A
[Footnote]
*1* Stepping back a bit, I think concentrating too much on "is it
    root?" is a wrong way to think about the problem.  Suppose you
    have two histories, e.g. (time flows from left to right; A and X
    are roots)
            A---B
                 \
          X---Y---Z
    and doing "git log --graph --oneline Z" would show A, B, X, Y
    and Z.
    If it benefits to show "A" (and "X") specially in the graph,
    that would mean that the current algorithm would show some other
    commit after showing A (probably X if it goes in chronological
    order), and it probably is confusing because X is shown on the
    same column as A, when there is no parent-child relationship
    between them (A is root after all).
    We are trying to highlight that A is not a child of anybody by
    using '#' instead.
    But in a slightly modified graph:
          C
         /
        O---A---B
                 \
          X---Y---Z
    if you do "git log --graph --oneline C..Z", you should see the
    same commits listed as above (A, B, X, Y and Z), and most likely
    in the same order.
    So special casing by "Ah, A is a root commit, so let's show it
    with '#'" does not help, even though we are facing exactly the
    same problem in the latter graph.
    And the right way to look at it is "does A have any parent in
    the part of the history being shown?", not "does A have any
    parent?"  Then 'A' will get exactly the same treatment in the
    two examples, and the visual problem that makes A appear as if
    it has parent-child relationship with unrelated commit X goes
    away.
    
Previous: Kyle MarekNext: Junio C Hamano
Message 8 of 29 in “add a blank line when a commit has no parent in log output?”
  1. Jason PyeronJan 14, 2021
  2. Philippe BlainJan 14, 2021
  3. Jason PyeronJan 14, 2021
  4. 0/2 Option to modify revision mark for root commitsKyle Marek, Jan 17, 2021
  5. 1/2 revision: Denote root commits with '#'Kyle Marek, Jan 17, 2021
  6. Junio C HamanoJan 17, 2021
  7. Kyle MarekJan 18, 2021
  8. Junio C HamanoJan 18, 2021
  9. Junio C HamanoJan 18, 2021
  10. Kyle MarekJan 19, 2021
  11. Junio C HamanoJan 19, 2021
  12. Kyle MarekJan 20, 2021
  13. Junio C HamanoJan 20, 2021
  14. Jason PyeronJan 20, 2021
  15. Junio C HamanoJan 20, 2021
  16. Jason PyeronJan 20, 2021
  17. Junio C HamanoJan 23, 2021
  18. Jason PyeronJan 23, 2021
  19. Junio C HamanoJan 23, 2021
  20. Jason PyeronJan 24, 2021
  21. Junio C HamanoJan 25, 2021
  22. Junio C HamanoJan 17, 2021
  23. 2/2 revision: implement --show-linear-break for --graphKyle Marek, Jan 17, 2021
  24. Junio C HamanoJan 17, 2021
  25. Junio C HamanoJan 18, 2021
  26. Kyle MarekJan 18, 2021
  27. Junio C HamanoJan 18, 2021
  28. Kyle MarekJan 19, 2021
  29. Junio C HamanoJan 15, 2021

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.