From: Junio C Hamano <junkio@cox.net>
To: Jakub Narebski <jnareb@gmail.com>
Cc: git@vger.kernel.org
Subject: Re: [RFD] Git glossary: 'branch' and 'head' description
Date: Wed, 17 May 2006 11:28:15 -0700 [thread overview]
Message-ID: <7viro4ecao.fsf@assigned-by-dhcp.cox.net> (raw)
In-Reply-To: <e4f1ta$e07$1@sea.gmane.org> (Jakub Narebski's message of "Wed, 17 May 2006 13:37:19 +0200")
Jakub Narebski <jnareb@gmail.com> writes:
> In #git channel somebody asked about 'branches' and 'heads' and was referred
> to the glossary. I had taken then a look at appropriate glossary entries.
>
> In 'Documentation/glossary.txt' we have:
> ----
> branch::
> A non-cyclical graph of revisions, i.e. the complete history of
> a particular revision, which is called the branch head. The
> branch heads are stored in `$GIT_DIR/refs/heads/`.
>
> head::
> The top of a branch. It contains a ref to the corresponding
> commit object.
>
> head ref::
> A ref pointing to a head. Often, this is abbreviated to "head".
> Head refs are stored in `$GIT_DIR/refs/heads/`.
>
> revision::
> A particular state of files and directories which was stored in
> the object database. It is referenced by a commit object.
> ----
>
> It is just me or the glossary entry for `branch` is unnecessary
> complicated?
While technically it might be correct, the above description for
"branch" completely misses the point in the context of other
entries. I do not recall when this entry was first written, but
I suspect it probably predates other entries that talk about the
same thing.
As you point out it talks primarily about the mesh of all
possible histories (i.e commit DAG), without talking much about
what "branch" means and what role "branch" plays.
I cannot easily do a glossary entry to describe that specific
term, but maybe somebody else can split the following up and
paraphrase.
A project history is born by recording a particular
state ("revision") as a root commit, and built up by
recording subsequent states ("revisions") on top of the
previous commits. Thus, a group of commits connected by
their parent fields form a directed acyclic graph
("DAG"). Often this linkage between commits by their
parent fields is called "ancestry chain", and a commit
that has another commit in its "parent" field is called
a "child commit" of the latter.
There can be multiple root commits in the history of a
project. In other words, projects born independently
can later be glued together to become a single project.
The history is grown by building on top of previous
commits, and by the nature of distributed development,
many lineages of histories are grown simultaneously.
Each lineage is called a "branch".
A commit that can be reached by following the ancestry
chain from a commit that is "on the branch" is also "on
the branch", and a commit that cannot be reached by
following the ancestry chain from any commit that is "on
the branch" is not "on the branch". The commit that
bootstraps this recursive definition of "on the branch"
is called its "branch head", the "tip of the branch", or
the "top commit". In other words, it is topologically
the latest commit on the branch.
The above does not mean the top commit of a branch does
not have any child commit in the global project
histories. It just means that these children are not on
the branch; they may be on some other branches, forked
from it. To create a branch whose "on the branch"
commits are strict superset of "on the branch" commits
of another branch is called "forking" the branch.
next prev parent reply other threads:[~2006-05-17 18:28 UTC|newest]
Thread overview: 13+ messages / expand[flat|nested] mbox.gz Atom feed top
2006-05-17 11:37 [RFD] Git glossary: 'branch' and 'head' description Jakub Narebski
2006-05-17 18:28 ` Junio C Hamano [this message]
2006-05-17 19:13 ` Jakub Narebski
2006-05-17 19:57 ` Junio C Hamano
2006-05-17 20:06 ` Jakub Narebski
2006-05-19 6:53 ` David Kågedal
2006-05-19 9:21 ` Shawn Pearce
2006-05-20 0:28 ` Daniel Barkalow
2006-05-20 0:35 ` Junio C Hamano
2006-05-20 1:36 ` Daniel Barkalow
2006-05-20 2:06 ` Linus Torvalds
2006-05-21 1:01 ` Shawn Pearce
2006-05-21 8:30 ` Jakub Narebski
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=7viro4ecao.fsf@assigned-by-dhcp.cox.net \
--to=junkio@cox.net \
--cc=git@vger.kernel.org \
--cc=jnareb@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).