With this new option it's possible to narrow the list of commits in the TODO list to only those commits you get following the first parent of each merge, i.e. not those from the merged branches. Signed-off-by: Jörg Sommer <joerg@xxxxxxxxxxxx> --- Documentation/git-rebase.txt | 7 ++++++- git-rebase--interactive.sh | 15 +++++++++++---- t/t3404-rebase-interactive.sh | 12 ++++++++++++ 3 files changed, 29 insertions(+), 5 deletions(-) diff --git a/Documentation/git-rebase.txt b/Documentation/git-rebase.txt index e0412e0..9ebbb90 100644 --- a/Documentation/git-rebase.txt +++ b/Documentation/git-rebase.txt @@ -11,7 +11,7 @@ SYNOPSIS 'git-rebase' [-i | --interactive] [-v | --verbose] [-m | --merge] [-s <strategy> | --strategy=<strategy>] [-C<n>] [ --whitespace=<option>] [-p | --preserve-merges] - [--onto <newbase>] <upstream> [<branch>] + [-f | --first-parent] [--onto <newbase>] <upstream> [<branch>] 'git-rebase' --continue | --skip | --abort DESCRIPTION @@ -247,6 +247,11 @@ OPTIONS Instead of ignoring merges, try to recreate them. This option only works in interactive mode. +-f, \--first-parent:: + This option implies the option --preserve-merges, but instead of + showing all commits from the merged branches show only the + commits and merges following the first parent of each commit. + include::merge-strategies.txt[] NOTES diff --git a/git-rebase--interactive.sh b/git-rebase--interactive.sh index d3327a8..ea67942 100755 --- a/git-rebase--interactive.sh +++ b/git-rebase--interactive.sh @@ -10,8 +10,8 @@ # The original idea comes from Eric W. Biederman, in # http://article.gmane.org/gmane.comp.version-control.git/22407 -USAGE='(--continue | --abort | --skip | [--preserve-merges] [--verbose] - [--onto <branch>] <upstream> [<branch>])' +USAGE='(--continue | --abort | --skip | [--preserve-merges] [--first-parent] + [--verbose] [--onto <branch>] <upstream> [<branch>])' OPTIONS_SPEC= . git-sh-setup @@ -565,6 +565,10 @@ do -p|--preserve-merges) PRESERVE_MERGES=t ;; + -f|--first-parent) + FIRST_PARENT=t + PRESERVE_MERGES=t + ;; -i|--interactive) # yeah, we know ;; @@ -621,10 +625,13 @@ do SHORTONTO=$(git rev-parse --short=7 $ONTO) common_rev_list_opts="--abbrev-commit --abbrev=7 --left-right --cherry-pick $UPSTREAM...$HEAD" - if test t = "$PRESERVE_MERGES" + if test t = "$PRESERVE_MERGES" -o t = "${FIRST_PARENT:-f}" then + opts= + test t = "${FIRST_PARENT:-f}" && \ + opts="$opts --first-parent" git rev-list --pretty='format:%h_%p_%s' --topo-order \ - $common_rev_list_opts | \ + $opts $common_rev_list_opts | \ grep -v ^commit | \ create_extended_todo_list else diff --git a/t/t3404-rebase-interactive.sh b/t/t3404-rebase-interactive.sh index f919aaf..8da7829 100755 --- a/t/t3404-rebase-interactive.sh +++ b/t/t3404-rebase-interactive.sh @@ -294,6 +294,18 @@ test_expect_success 'rebase with preserve merge forth and back is a noop' ' test "$head" = "$(git rev-parse HEAD)" ' +test_expect_success 'interactive --first-parent gives a linear list' ' + head=$(git rev-parse HEAD) && + EXPECT_COUNT=6 FAKE_LINES="2 1 4 3 6 5" \ + git rebase -i -f --onto dead-end master && + test "$head" != "$(git rev-parse HEAD)" && + git rev-parse HEAD^^2 && + test "$(git rev-parse HEAD~6)" = "$(git rev-parse dead-end)" && + EXPECT_COUNT=6 FAKE_LINES="2 1 4 3 6 5" \ + git rebase -i -f --onto master dead-end && + test "$head" = "$(git rev-parse HEAD)" +' + test_expect_success '--continue tries to commit' ' git checkout to-be-rebased && test_tick && -- 1.5.5 -- To unsubscribe from this list: send the line "unsubscribe git" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html