A more detailed explanation follows.
Suppose you specified
foo as the <paths>. We shall call commits that modify
foo !TREESAME, and the rest TREESAME. (In a diff filtered for
foo, they look different and equal, respectively.)
In the following, we will always refer to the same example history to illustrate the differences between simplification settings. We assume that you are filtering for a file
foo in this commit graph:
.-A---M---N---O---P---Q / / / / / / I B C D E Y \ / / / / / `-------------' X
The horizontal line of history A---Q is taken to be the first parent of each merge. The commits are:
Iis the initial commit, in which
fooexists with contents “asdf”, and a file
quuxexists with contents “quux”. Initial commits are compared to an empty tree, so
foocontains just “foo”.
Bcontains the same change as
A. Its merge
Mis trivial and hence TREESAME to all parents. M有兩個parent，分別是A和B，但是相對A和B而言，從文件內容來看，是沒有差異的
Cdoes not change
foo, but its merge
Nchanges it to “foobar”, so it is not TREESAME to any parent.
footo “baz”. Its merge
Ocombines the strings from
Dto “foobarbaz”; i.e., it is not TREESAME to any parent.
quuxto “xyzzy”, and its merge
Pcombines the strings to “quux xyzzy”.
Pis TREESAME to
O, but not to
Xis an independent root commit that added a new file
Yis TREESAME to
X. Its merge
Qis TREESAME to
P, but not to
rev-list walks backwards through history, including or excluding commits based on whether
--full-history and/or parent rewriting (via
--children) are used. The following settings are available.