* lt/decorate:
rev-list documentation: clarify the two parts of history simplification
Document "git log --simplify-by-decoration"
Document "git log --source"
revision traversal: '--simplify-by-decoration'
Make '--decorate' set an explicit 'show_decorations' flag
revision: make tree comparison functions take commits rather than trees
Add a 'source' decorator for commits
Conflicts:
Documentation/rev-list-options.txt
@ -285,8 +285,52 @@ See also linkgit:git-reflog[1].
@@ -285,8 +285,52 @@ See also linkgit:git-reflog[1].
History Simplification
~~~~~~~~~~~~~~~~~~~~~~
When optional paths are given, 'git rev-list' simplifies commits with
various strategies, according to the options you have selected.
Sometimes you are only interested in parts of the history, for example the
commits modifying a particular <path>. But there are two parts of
'History Simplification', one part is selecting the commits and the other
is how to do it, as there are various strategies to simplify the history.
The following options select the commits to be shown:
<paths>::
Commits modifying the given <paths> are selected.
--simplify-by-decoration::
Commits that are referred by some branch or tag are selected.
Note that extra commits can be shown to give a meaningful history.
The following options affect the way the simplification is performed:
Default mode::
Simplifies the history to the simplest history explaining the
final state of the tree. Simplest because it prunes some side
branches if the end result is the same (i.e. merging branches
with the same content)
--full-history::
As the default mode but does not prune some history.
--dense::
Only the selected commits are shown, plus some to have a
meaningful history.
--sparse::
All commits in the simplified history are shown.
--simplify-merges::
Additional option to '--full-history' to remove some needless
merges from the resulting history, as there are no selected
commits contributing to this merge.
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
@ -456,6 +500,14 @@ Note the major differences in `N` and `P` over '\--full-history':
@@ -456,6 +500,14 @@ Note the major differences in `N` and `P` over '\--full-history':
removed completely, because it had one parent and is TREESAME.
--
The '\--simplify-by-decoration' option allows you to view only the
big picture of the topology of the history, by omitting commits
that are not referenced by tags. Commits are marked as !TREESAME
(in other words, kept after history simplification rules described
above) if (1) they are referenced by tags, or (2) they change the
contents of the paths given on the command line. All other
commits are marked as TREESAME (subject to be simplified away).
* If we are simplifying by decoration, then the commit
* is worth showing if it has a tag pointing at it.
*/
if (lookup_decoration(&name_decoration, &commit->object))
return REV_TREE_DIFFERENT;
/*
* A commit that is not pointed by a tag is uninteresting
* if we are not limited by path. This means that you will
* see the usual "commits that touch the paths" plus any
* tagged commit by specifying both --simplify-by-decoration
* and pathspec.
*/
if (!revs->prune_data)
return REV_TREE_SAME;
}
if (!t2)
return REV_TREE_DIFFERENT;
tree_difference = REV_TREE_SAME;
@ -306,12 +330,13 @@ static int rev_compare_tree(struct rev_info *revs, struct tree *t1, struct tree
@@ -306,12 +330,13 @@ static int rev_compare_tree(struct rev_info *revs, struct tree *t1, struct tree
return tree_difference;
}
static int rev_same_tree_as_empty(struct rev_info *revs, struct tree *t1)
static int rev_same_tree_as_empty(struct rev_info *revs, struct commit *commit)