git@vger.kernel.org mailing list mirror (one of many)
 help / color / mirror / code / Atom feed
From: Felipe Contreras <felipe.contreras@gmail.com>
To: Sergey Organov <sorganov@gmail.com>,
	Felipe Contreras <felipe.contreras@gmail.com>
Cc: Martin <git@mfriebe.de>, Junio C Hamano <gitster@pobox.com>,
	git@vger.kernel.org
Subject: Re: What actually is a branch?
Date: Wed, 07 Jul 2021 22:12:40 -0500	[thread overview]
Message-ID: <60e66d28c0cb3_306ac120813@natae.notmuch> (raw)
In-Reply-To: <877di13hhe.fsf@osv.gnss.ru>

Sergey Organov wrote:
> Felipe Contreras <felipe.contreras@gmail.com> writes:
> 
> > Since this is not strictly related to the topic of `git switch` I
> > renamed the thread.
> >
> > Sergey Organov wrote:
> >> Felipe Contreras <felipe.contreras@gmail.com> writes:
> >> > Sergey Organov wrote:
> >
> >> >> Overall, if we aim at clear documentation, we need to define our
> >> >> documentation terms as precise as possible, and then use them
> >> >> consistently.
> >> >> 
> >> >> For example:
> >> >> 
> >> >> "branch": a chain of commits
> >> >> 
> >> >> "branch tip": the most recent commit in a branch
> >> >> 
> >> >> "branch name": specific type of symbolic reference pointing to a
> >> >> branch tip
> >> >
> >> > Completely agree on all three (although I would call it "branch head",
> >> > not "branch tip").
> >> 
> >> I see why "branch head", as you later introduce "branch tail", but a
> >> branch (of a plant) has no "head" (nor "tail"), right? BTW, how the base
> >> of a plant branch is called in English, and how one finds "branch tail"
> >> on a real tree anyway? I mean, there are probably a few of them, at
> >> every fork. In Git it's even more vague, as a branch could logically
> >> begin at any place, not necessarily at a fork point.
> >
> > We don't necessarily need a 1-to-1 mapping with common English (although
> > that would be nice). Anoher option could be "base" and "tip".
> >
> >> OTOH, "head" and "tail" are obviously taken from CS "list" concept, and,
> >> provided "chain" == "list", it does make sense.
> >
> > I took it from Mercurial, where the tip of a branch is called "head",
> > and in fact a branch can have multiple heads.
> >
> >> And then we have 'HEAD' that points to the current branch tip anyway.
> >
> > It actually points to a branch, or rather references a branch, since it
> > uses the branch name.
> 
> Yes, but it still points to the branch tip, indirectly, or even
> directly, when in "detached head" state, that, by the way, I'd vote to
> abandon, replacing it with more user-friendly "unnamed branch" or
> something like that.

Yes, but most of the time it's indirectly.

> >> Dunno, in fact I don't have any preference among "tip" and "head".
> >
> > I don't either, but from different sources (non-git-specific) I've heard
> > "head" more often.
> >
> >> As for branch tail, I do have convention of marking start of a
> >> long-standing branch with corresponding tag, where branch "foo" has
> >> corresponding "foo-bp" tag marking its "branch point". Recently I
> >> started to mark start of feature branch with yet another branch "foo-bp"
> >> rather than tag, "foo" being set to track "foo-bp", that allows to
> >> automate rebasing of "foo" against correct base.
> >
> > So foo-bp is the upstream of foo, and you do basically:
> >
> >   git rebase foo@{upstream}
> 
> Yep, but essential feature to me is that I in fact use tools that simply
> run bare
> 
>    git rebase
> 
> and that "just works" (tm).

I typed the revision explicitly, but `git rebase` would work just fine.

> > This is works if your base (or tail, or whatever) is static, but many
> > branches jump around, and that's where @{tail} comes in handy.
> 
> Yeah, I see. When I need to make a branch jump around, I do need to
> manually move my references, but that's fortunately very rare use-case
> for me. Having direct support for that is still a win.
> 
> >
> > You can do this:
> >
> >   git rebase --onto foo@{upstream} foo@{tail}
> >
> > This will always rebase the right commits (no need to look into the
> > reflog). So you can say that the branch is foo@{tail}..foo.
> 
> I see where and when it's useful, but for a feature branch 99% of times
> I don't want to rebase it onto some true upstream. I rather want to just
> fiddle with the branch in place, and I prefer to setup things the way
> that ensures that bare "git rebase" does "the right thing".

But that's precisely the point: when you do `git rebase` you don't have
to type the base or --onto anymore. It's done automatically.

Not just for your long-standing branches, but for *any* branch.

> Probably that could be solved by a branch-local configuration that makes
> "git rebase" become "git rebase @{tail}" for the branch instead of "git
> rebase @{upstream}"

No. @{upstream} is where you want to rebase *to*, @{tail} is where you
want to rebase *from*.

When you do:

  git rebase foo@{upstream}

This is basically the same as:

  git checkout foo@{upstream}^0
  git cherry-pick --right-only foo@{upstream}...foo

git is smart enough to figure out what commits are already part of
foo@{upstream}, and those are skipped, but at no point was any "base"
calculated (at least not from `git rebase`).

Most of the time `git rebase` works fine, because there aren't too many
commits to figure out where they should go, but it's definitely not
efficient, and there's many corner-cases (see a Linux kernel maintaner
baffled by what the hell `git rebase` is doing [1]).

> > Another advantage of having this notion is that `git rebase`
> > automatically updates the tail (in this case to foo@{upstream}).
> 
> Yep, looks useful. Is it all local to given repo, or else?

I implented it as 'refs/tails' (as opposed to 'refs/heads'), so it's
local to a given repo, but could easily be exported.

[1] https://lore.kernel.org/git/60b272ff6bfa4_265861208d6@natae.notmuch/

-- 
Felipe Contreras

  parent reply	other threads:[~2021-07-08  3:12 UTC|newest]

Thread overview: 103+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2021-06-29 15:28 PATCH: improve git switch documentation Martin
2021-06-29 16:35 ` Junio C Hamano
2021-06-29 19:04   ` Martin
2021-06-29 22:39     ` Junio C Hamano
2021-06-30  8:50       ` Martin
2021-06-30 22:59         ` Junio C Hamano
2021-07-01 10:06           ` Martin
2021-07-01 11:27             ` Sergey Organov
2021-07-07 18:34               ` Felipe Contreras
2021-07-07 20:46                 ` Sergey Organov
2021-07-07 21:25                   ` What actually is a branch? Felipe Contreras
2021-07-07 22:07                     ` Sergey Organov
2021-07-07 22:35                       ` Martin
2021-07-08  3:39                         ` Felipe Contreras
2021-07-08 10:15                           ` Martin
2021-07-08 17:33                             ` Felipe Contreras
2021-07-08 19:21                               ` Martin
2021-07-08 20:37                                 ` Felipe Contreras
2021-07-08 23:11                                   ` Martin
2021-07-09  0:45                                     ` Felipe Contreras
2021-07-09 13:24                                       ` Martin
2021-07-09 15:08                                         ` Felipe Contreras
2021-07-09 15:23                                           ` switch requires --detach [[Re: What actually is a branch]] Martin
2021-07-09 16:21                                             ` Felipe Contreras
2021-07-09 16:38                                               ` Randall S. Becker
2021-07-09 17:10                                                 ` Felipe Contreras
2021-07-09 16:54                                               ` Martin
2021-07-10 10:08                                             ` Sergey Organov
2021-07-10 19:18                                               ` Felipe Contreras
2021-07-09 14:29                                       ` PATCH: improve git switch documentation Martin
2021-07-09 16:10                                         ` Felipe Contreras
2021-07-09 16:51                                           ` Martin
2021-07-09 17:41                                             ` Felipe Contreras
2021-07-09 18:23                                               ` Martin
2021-07-10 19:45                                                 ` Felipe Contreras
2021-07-10 20:07                                                   ` Martin
2021-07-10 20:49                                                     ` Felipe Contreras
2021-07-10 22:13                                                       ` Martin
2021-07-10 23:35                                                         ` Felipe Contreras
2021-07-11  9:10                                                           ` Martin
2021-07-11  9:30                                                             ` Sergey Organov
2021-07-12 16:28                                                             ` Felipe Contreras
2021-07-12 16:33                                                               ` Martin
2021-07-12 16:58                                                                 ` Felipe Contreras
2021-07-12 17:52                                                                   ` Martin
2021-07-12 19:08                                                                     ` Felipe Contreras
     [not found]                                                                       ` <3a84e4c9-4e48-1cbe-4fe6-150ff56c8508@mfriebe.de>
     [not found]                                                                         ` <60ecbe577a086_a6b702082@natae.notmuch>
2021-07-13 10:42                                                                           ` Martin
2021-07-13 16:02                                                                             ` Felipe Contreras
2021-07-16 18:12                                                                               ` Martin
2021-07-16 18:31                                                                               ` Martin
2021-07-16 18:56                                                                                 ` Felipe Contreras
2021-07-17  7:02                                                                                   ` Martin
     [not found]                                                                                   ` <1997ca3b-117a-e19a-0dee-7342a2f1a0e7@mfriebe.de>
     [not found]                                                                                     ` <60f1f4c3dd8b1_14cb208c1@natae.notmuch>
     [not found]                                                                                       ` <fedbfe1f-9e6d-f46f-ca41-e176a30e938c@mfriebe.de>
     [not found]                                                                                         ` <60f22aaa6a4f1_1f602081b@natae.notmuch>
2021-07-17 10:07                                                                                           ` Martin
     [not found]                                                                                             ` <60f33f8a7c39b_507220823@natae.notmuch>
2021-07-17 21:23                                                                                               ` Martin
2021-07-19 17:51                                                                                                 ` Felipe Contreras
2021-07-11  7:57                                                         ` Sergey Organov
2021-07-11  9:27                                                           ` Martin
2021-07-11  9:37                                                             ` Sergey Organov
2021-07-11 10:24                                                               ` Martin
2021-07-12 16:34                                                             ` Felipe Contreras
2021-07-10 22:13                                                       ` Naming the --forec option [[Re: PATCH: improve git switch documentation]] Martin
2021-07-10 23:18                                                         ` Felipe Contreras
2021-07-11  0:39                                                           ` Martin
2021-07-12 16:15                                                             ` Felipe Contreras
2021-07-10 10:24                                             ` PATCH: improve git switch documentation Sergey Organov
2021-07-10 10:37                                               ` Bagas Sanjaya
2021-07-10 11:05                                               ` Martin
2021-07-10 16:32                                                 ` Sergey Organov
2021-07-10 20:12                                                   ` Felipe Contreras
2021-07-11  9:04                                                     ` Sergey Organov
2021-07-11 10:05                                                       ` Martin
2021-07-11 12:23                                                         ` Sergey Organov
2021-07-11 13:39                                                           ` Martin
2021-07-11 14:49                                                             ` Sergey Organov
2021-07-11 16:51                                                             ` Sergey Organov
2021-07-12 10:31                                                               ` Kerry, Richard
2021-07-12 11:11                                                                 ` Sergey Organov
2021-07-12 16:55                                                                   ` Felipe Contreras
2021-07-12 16:24                                                       ` Felipe Contreras
2021-07-12 16:39                                                         ` Martin
2021-07-12 17:09                                                           ` Felipe Contreras
2021-07-12 22:58                                                         ` Sergey Organov
2021-07-12 23:36                                                           ` Felipe Contreras
2021-07-13 11:20                                                           ` Martin
2021-07-10 20:00                                                 ` Felipe Contreras
2021-07-10 19:51                                               ` Felipe Contreras
2021-07-11  9:52                                                 ` Sergey Organov
2021-07-12 16:44                                                   ` Felipe Contreras
2021-07-13 10:57                                                     ` Sergey Organov
2021-07-13 16:10                                                       ` Felipe Contreras
2021-07-14 19:14                                                         ` Sergey Organov
2021-07-14 19:51                                                           ` Felipe Contreras
2021-07-14 20:42                                                             ` Sergey Organov
2021-07-08  3:12                       ` Felipe Contreras [this message]
2021-07-08 11:16                         ` What actually is a branch? Sergey Organov
2021-07-08 18:05                           ` Felipe Contreras
2021-07-01 14:58             ` PATCH: improve git switch documentation Junio C Hamano
2021-07-01 17:29               ` Martin
2021-07-01 17:46                 ` Sergey Organov
2021-07-07 18:54                 ` Felipe Contreras
2021-07-07 18:47               ` Felipe Contreras
2021-07-07 18:14             ` Felipe Contreras
2021-07-01  0:06         ` Matt Rogers

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

  List information: http://vger.kernel.org/majordomo-info.html

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=60e66d28c0cb3_306ac120813@natae.notmuch \
    --to=felipe.contreras@gmail.com \
    --cc=git@mfriebe.de \
    --cc=git@vger.kernel.org \
    --cc=gitster@pobox.com \
    --cc=sorganov@gmail.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
Code repositories for project(s) associated with this public inbox

	https://80x24.org/mirrors/git.git

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).