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

Need to change old commit (and regenerate tree)

From
APAntriksh Pany <antriksh.pany@gmail.com>
Date
May 20, 2010, 19:17 UTC
Message-ID
<AANLkTilTAknKPFv5AZBrwsITPsRlVSnsuX8TDXlUTWmw@mail.gmail.com>
Hi all

My question is this: I have two branches (say B and C) where one is reachable from the other (say B is ancestor of C), and if they are separately rebased about/onto the same point, why do B and C become non-overlapping branches?

Let me explain with an example.
Say I have the following commit line:
A--------o--------o--------o--------B--------o--------o--------C

A, B and C are branches (so that B is reachable from C, and A is reachable from B). [For ease, I am drawing the branches at the same level since there are no real diverging branches here.]

I then realise that I want to change the commit A and have both B and C rebased on this changed commit.

Now when I do a
  $ git rebase --onto A2 A C
This results in two parallel trees like these:
A--------o--------o--------o--------B--------o--------o--------o(old C)
A2--------o--------o--------o--------o--------o--------o--------C
Now I go about rebasing B. I can of course 'reset' B to C~3. But
alternatively, if I decide to do a rebase:
  $ git rebase --onto A2 A B
I will end up getting
A--------o--------o--------o--------o(old B)--------o--------o--------o(old C)
A2--------o--------o--------o--------o--------o--------o--------C
   \
     ` -----o--------o--------o--------B
Instead of (what I initially expected):
A--------o--------o--------o--------o(old B)--------o--------o--------o(old C)
A2--------o--------o--------o--------B--------o--------o--------C

So what I am missing here? Aren't the new commits B~1, B~2, B~3 identical to C~4, C~5, C~6 (respectively) in all ways so as to have gotten them the same SHA1 and hence appear as what I expected them to appear?

I have taken a simple example here. In reality, I wanted to change a not so new commit (on the main line), and there were many branches diverging out from the main line after the (bad) commit. I initially thought I could just write a simple script that would rebase all branches that have the bad commit as an ancestor, and the new tree would be a mirror image of the original. But that was not to be! There is also the problem of resetting tags (and possible notes).

I am sorry if this has already been discussed, please point me to the right resource if so.

My git version:
  $ git --version
  git version 1.7.0.5

Thanks Antriksh Pany

Next: Andreas Schwab
Message 1 of 6 in “Need to change old commit (and regenerate tree)”
  1. Antriksh PanyMay 20, 2010
  2. Andreas SchwabMay 20, 2010
  3. Jon SeymourMay 20, 2010
  4. Antriksh PanyMay 21, 2010
  5. Geert UytterhoevenMay 21, 2010
  6. Antriksh PanyMay 21, 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.