[PATCH v2 11/13] Add option --first-parent
From: Jörg Sommer <hidden>
Date: 2016-06-15 22:44:28
Subsystem:
documentation, the rest · Maintainers:
Jonathan Corbet, Linus Torvalds
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 <redacted> --- 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