An illustration of rev-list --parents --pretty=raw
commit16652170bf80542fd77de75fb88da2f7761f65c4
authorJunio C Hamano <junkio@cox.net>
Wed, 27 Sep 2006 19:34:37 +0000 (27 12:34 -0700)
committerJunio C Hamano <junkio@cox.net>
Wed, 27 Sep 2006 19:34:37 +0000 (27 12:34 -0700)
tree0e279d048b249107f69c35876a0d83adcd1dda29
parent4a0641b7cf833644b286b56bb57d66b5538e4418
An illustration of rev-list --parents --pretty=raw

This script creates two separate histories, A and B, each of
which does:

      (A0, B0): create fileA and subdir/fileB
      (A1, B1): modify fileA
      (A2, B2): modify subdir/fileB

and then grafts them together to make B0 a child of A2.  So
the final history looks like (time flows from top to bottom):

true parent touches subdir?

A0 none yes (creates it)
        A1      A0 no
        A2 A1 yes
        B0 none yes (different from what's in A2)
        B1 B0 no
        B2 B1 yes

"git rev-list --parents --pretty=raw B2" would give "fake"
parents on the "commit " header lines while "parent " header
lines show the parent as recorded in the commit object (i.e. B0
appears to have A2 as its parent on "commit " header but there
is no "parent A2" header line in it).

When you have path limiters, we simplify history to omit
commits that do not affect the specified paths.

So "git rev-list --parents --pretty=raw B2 subdir" would return
"B2 B0 A2 A0" (because B1 and A1 do not touch the path).  When
it does so, the "commit " header lines have "fake" parents
(i.e. B2 appears to have B0 as its parent on "commit " header),
but you can still get the true parents by looking at "parent "
header.

Signed-off-by: Junio C Hamano <junkio@cox.net>
t/t6001-rev-list-graft.sh [new file with mode: 0755]