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

Re: Walking commits from the first

From
Jeff King <peff@peff.net>
Date
Feb 15, 2010, 08:06 UTC
Message-ID
<20100215080646.GD5347@coredump.intra.peff.net>
In-Reply-To
<e72faaa81002142039h5531a19y354d24e595295bb1@mail.gmail.com>
On Mon, Feb 15, 2010 at 10:09:02AM +0530, Pavan Kumar Sunkara wrote:
Show 6 quoted lines
>  When you clone a big git repository and would like to read and
> understand the source code, you need to checkout and read every commit
> right from the first commit. As per my knowledge, there is no command
> (even with flags) to checkout the first commit of the repository.
> 
> If there is some command, please put it in user's manual
In most repositories, you can do this:
  git checkout `git rev-list --reverse HEAD | head -n 1`
but...
Show 8 quoted lines
> I know that every git commit is a vertice in a DAG which has it's edge
> pointed to it's parent. So, walking from the latest commits to old
> commits is easy but the reverse is not.
> I would like to know if there is any problem if we make the walking
> bidirectional. What i mean is, when a new commit is created, create an
> edge not only from it to it's parent but also from it's parent to it.
> Also, have something for the first commit of the repo which can be
> referred as INIT (similiar to HEAD)
It is not as simple as that, for two reasons.

For walking backwards, you can take multiple paths from merge commits (which have multiple parents). So there may actually be several "first commits" if unrelated lines of development were merged together. For example, in git.git:

  $ git log --format='%h %p' |
    grep ' $'
  16d6b8a
  cb07fc2
  161332a
  1db95b0
  2744b23
  e83c516

There are six root commits. You can see what they are by piping the above into "tr -d ' ' | git log --no-walk --stdin".

For your "--next" suggestion, it is even worse. There may be an infinite number of commits that point to a given commit as the parent. So there is no such thing as "what came next from X". You can only ask "leading up to some commit Y which is a descendant of X, what was the commit that came after X". But while there are a finite number of answers, there is not necessarily just one. If two branches diverged at X and then remerged before Y, they are both equally "next".

-Peff
Previous: Pavan Kumar SunkaraNext: Pavan Kumar Sunkara
Message 2 of 5 in “Walking commits from the first”
  1. Pavan Kumar SunkaraFeb 15, 2010
  2. Jeff KingFeb 15, 2010
  3. Pavan Kumar SunkaraFeb 15, 2010
  4. Jon SeymourFeb 15, 2010
  5. Jon SeymourFeb 15, 2010

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.