This modifies the algoritm of topopological ordering. The problem with the current algoritm is that it displays the graph below as following * E |\ | * D | |\ | |/ |/| * | C | * B |/ * A commit B is placed between A and C, which is wrong because E stays that D and B comes after C the only correct solution here is * E |\ | * D | |\ | |/ |/| | * B * | C |/ * A while it seems that it contradicts to D staiting that C shoud be between D and B The new algorithm solves this issue Here is an example: walk to to the root via "first" parents go E -> C -> A print A because it has no parents step back to C print C because it has no other parents then step back to E go D -> B -> A do not print A becase A is already printed step back to B print B so on This change makes option "--topo-order" obsolete, because for a single commit there is only one way to order parents. "--date-order" and "--author-date-order" are preserved and make sence only for the case when multiple commits are given to be able to sort those commits. Sergey Rudyshin (1): Preserve topological ordering after merges This modifies the algorithm of topopological ordering. The problem with the current algoritm is that it displays the graph below as follows Documentation/git-rev-list.txt | 4 +- Documentation/rev-list-options.txt | 41 +++--- commit.c | 149 ++++++++++++++------- commit.h | 4 +- t/t4202-log.sh | 15 +-- t/t4215-log-skewed-merges.sh | 44 +++--- t/t6003-rev-list-topo-order.sh | 54 ++++---- t/t6012-rev-list-simplify.sh | 8 +- t/t6016-rev-list-graph-simplify-history.sh | 41 +++--- t/t6600-test-reach.sh | 6 +- 10 files changed, 214 insertions(+), 152 deletions(-) base-commit: 8679ef24ed64018bb62170c43ce73e0261c0600a Published-As: https://github.com/gitgitgadget/git/releases/tag/pr-514%2FSergeyRudyshin%2Ftopo_order_fix-v1 Fetch-It-Via: git fetch https://github.com/gitgitgadget/git pr-514/SergeyRudyshin/topo_order_fix-v1 Pull-Request: https://github.com/gitgitgadget/git/pull/514 -- gitgitgadget