git.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
From: Felipe Contreras <felipe.contreras@gmail.com>
To: Martin <git@mfriebe.de>,
	Felipe Contreras <felipe.contreras@gmail.com>,
	Sergey Organov <sorganov@gmail.com>
Cc: Junio C Hamano <gitster@pobox.com>, git@vger.kernel.org
Subject: Re: What actually is a branch?
Date: Thu, 08 Jul 2021 15:37:56 -0500	[thread overview]
Message-ID: <60e762243aab1_30a7b02089@natae.notmuch> (raw)
In-Reply-To: <155308af-42ad-b044-fb37-676251a9b7e1@mfriebe.de>

Martin wrote:
> On 08/07/2021 19:33, Felipe Contreras wrote:
> > The only reason I mentioned @{tail} (or @{base}) is to have a better
> > mental model of what a branch is.
> > 
> >   1. A branch is whatever is inside `branch@{base}..branch`
> 
> For this part "branch" = some series of commits.
> 
> Then this is what I would say is a common misunderstanding.
> 
> Yet that may be the difference between what people want the branch to 
> be, and what it (afaik) technically is.

I'm not talking about what a branch technically is, I'm talking about
what it is semantically.

Technically a branch is a file with an object id in it. That doesn't
give the user any useful information.

What is important is the *meaning* of that file.

> People indeed tend to thing, I branched at X, so anything before is not 
> part of the branch.
> "--contains" says otherwise.

Yes, that is the status quo, but the fact that X is the case doesn't
mean it *should* be the case.

The ideal user interface doesn't need to be explained. The more you need
to explain a concept the less intuitive it is, and the more you should
look for another concept that is perhaps more intuitive.

A branch that you hold, or point to, is a concete concept easy to
underand. When I say: "me, my sister, and my father are one tiny branch
of the Contreras family", people understand what that means inuitively.

On the other hand saying "Felipe contains his great-great-grandfather"
would stop anyone on their tracks.

> Thinking of it.
> 
> If I look at a feature branch, then my feature starts where I created 
> the branch. I want my feature branch to represent this.
> 
> But if I look at my local master branch (or any tracking branch), I like 
> to believe that it contains the same as the remote branch.
> And well, if we just set the base for the local tracking branch to be 
> the same as the base for the remote branch that would be fine.
> But if (after diverging, due to changes pulled from remote) then, I run
>     git rebase @{base} @{remote}
> then rebase has to skip all the shared commits.
> 
> And since rebase also repoints the "base", my local branch then no 
> longer contains the same as the remote.

That is a *very* interesting case that exemplifies the lack of our
current semantic arsenal.

Every time you do a rebase you are in effect creating a new branch with
new commits, a new head, and a new base. The only thing that remains
the same is the name.

It is no longer the same as the remote branch, or an outgrowth; it's
a new branch.

If you send a pull request for your 'master' branch, which then gets
merged to 'origin/master', then you can do `git merge --ff-only` to
advance the head pointer of the 'master' branch to the remote branch so
both are in sync... Except the base won't be the same.

With the current semantics this recreated 'master' is now exactly the
same as the remote 'origin/master'. But not with the @{base} semantics;
since both branches have a different base, they are strictly speaking
different branchs.

But if you do `git reset --hard origin/master`, you are saying: drop
everything about this branch, and make it the same 'origin/master'.
*Now* we have a reason to distinguish `git merge --ff-only` from `git
reset --hard`.

> So limiting the branch to branch@{base}..branch only works for feature 
> branches.
> 
> 
> So yes, what is a branch? More exactly what does it contain.
> Two examples, that to me suggest two answers.

Not necessarily. See above.

> Also if branch@{base}..branch  then there is a problem.
> - branch@{base} is then correctly not part of the branch
> - So immediately after "git switch -c branch" the branch is empty => ok
> But if so, then what is the branch head at that time?
> The Pointer would point the @{base}, but @base is outside the branch. So 
> the pointer of the branch points outside the branch?

Yes, the base pointer doesn't include the branch. When you do
`branch@{base}..branch` that's the same as `^branch@{base} branch` so that
excludes all the commits rechable from branch@{base} *including* that
commit iself.

> >   2. `branch` is the branch head (`branch@{head}`), but it's not the
> >      branch itself
> Well technically "branch" is the "pointer" to the head.
> Assuming we want "head" to be a commit?

No, the branch head is a reference: 'refs/heads/master'. The reference
points to a commit, but it's not the commit itself.

So it's a pointer to a pointer.

> The only problem is:
> branch is too often used for "the commits contained in the branch". That 
> is way to common to even try to stop it.

We don't need to stop it, we can sidestep it.

Instead of talking about the branch, talk about the branch head:
"the brach head is moved to X".

Or if you want to use the branch, don't assume any specifics:
"the branch is recreated to be the same as X".

> > When you change the branch head you are effectively changing the branch.
> Well if branch is the pointer, then you change the branch, and head is 
> being changed.
> If branch is the content, then you change the head, and yes the content 
> changes.

Exactly, so regardless of which semantics you choose, everyone
understands that the branch is not the same anymore.

-- 
Felipe Contreras

  reply	other threads:[~2021-07-08 20:38 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 [this message]
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                       ` What actually is a branch? Felipe Contreras
2021-07-08 11:16                         ` 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

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

  git send-email \
    --in-reply-to=60e762243aab1_30a7b02089@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.
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 NNTP newsgroup(s).