If set, the second column of the rebase todo contains named revisions (obtained with git name-rev) instead of short SHA1s. --- Documentation/git-rebase.txt | 7 +++++++ git-rebase--interactive.sh | 10 ++++++++-- git-rebase.sh | 10 ++++++++++ t/t3404-rebase-interactive.sh | 10 ++++++++++ t/t3415-rebase-autosquash.sh | 24 ++++++++++++++++++++++++ 5 files changed, 59 insertions(+), 2 deletions(-) diff --git a/Documentation/git-rebase.txt b/Documentation/git-rebase.txt index 504945c..da2aca7 100644 --- a/Documentation/git-rebase.txt +++ b/Documentation/git-rebase.txt @@ -365,6 +365,13 @@ If the '--autosquash' option is enabled by default using the configuration variable `rebase.autosquash`, this option can be used to override and disable this setting. +--name-rev:: + Instead of showing short SHA1 hashes in the todo list, show + human-readable revisions obtained with linkgit:git-name-rev[1]. ++ +This option is only valid when the '--interactive' option is used. It can also +be set through the `rebase.interactiveNameRev` configuration variable. + --no-ff:: With --interactive, cherry-pick all rebased commits instead of fast-forwarding over the unchanged ones. This ensures that the diff --git a/git-rebase--interactive.sh b/git-rebase--interactive.sh index e408e94..c597b6b 100644 --- a/git-rebase--interactive.sh +++ b/git-rebase--interactive.sh @@ -780,9 +780,15 @@ git rev-list $merges_option --format="%m%H %h %s" --abbrev-commit \ sed -n "s/^>//p" | while read -r sha1 shortsha1 rest do + if test t = "$name_rev" + then + rev="$(git name-rev $sha1 | cut -d\ -f2)" + else + rev="$shortsha1" + fi if test t != "$preserve_merges" then - printf '%s\n' "pick $shortsha1 $rest" >> "$todo" + printf '%s\n' "pick $rev $rest" >> "$todo" else if test -z "$rebase_root" then @@ -800,7 +806,7 @@ do if test f = "$preserve" then touch "$rewritten"/$sha1 - printf '%s\n' "pick $shortsha1 $rest" >> "$todo" + printf '%s\n' "pick $rev $rest" >> "$todo" fi fi done diff --git a/git-rebase.sh b/git-rebase.sh index 69c1374..9330be3 100755 --- a/git-rebase.sh +++ b/git-rebase.sh @@ -43,6 +43,8 @@ s,strategy=! use the given merge strategy no-ff! cherry-pick all commits, even if unchanged m,merge! use merging strategies to rebase i,interactive! let the user edit the list of commits to rebase +name-rev show revisions by name in the list of commits +no-name-rev show revisions by short SHA1 in the list (default) f,force-rebase! force rebase even if branch is up to date X,strategy-option=! pass the argument through to the merge strategy stat! display a diffstat of what changed upstream @@ -98,6 +100,8 @@ action= preserve_merges= autosquash= test "$(git config --bool rebase.autosquash)" = "true" && autosquash=t +name_rev= +test "$(git config --bool rebase.interactivenamerev)" = "true" && name_rev=t read_basic_state () { head_name=$(cat "$state_dir"/head-name) && @@ -287,6 +291,12 @@ do -f|--no-ff) force_rebase=t ;; + --name-rev) + name_rev=t + ;; + --no-name-rev) + name_rev= + ;; --rerere-autoupdate|--no-rerere-autoupdate) allow_rerere_autoupdate="$1" ;; diff --git a/t/t3404-rebase-interactive.sh b/t/t3404-rebase-interactive.sh index b981572..f3b4214 100755 --- a/t/t3404-rebase-interactive.sh +++ b/t/t3404-rebase-interactive.sh @@ -163,6 +163,16 @@ test_expect_success 'exchange two commits' ' test G = $(git cat-file commit HEAD | sed -ne \$p) ' +cat > expect-rebase-todo <<EOF +pick branch1~1 H +pick branch1 G +EOF + +test_expect_success 'Symbolic revisions in --name-rev' ' + FAKE_LINES="exec_cp_.git/rebase-merge/git-rebase-todo_rebase-todo 1 2" git rebase -i --name-rev HEAD~2 && + test_cmp expect-rebase-todo rebase-todo +' + cat > expect << EOF diff --git a/file1 b/file1 index f70f10e..fd79235 100644 diff --git a/t/t3415-rebase-autosquash.sh b/t/t3415-rebase-autosquash.sh index b38be8e..3062e24 100755 --- a/t/t3415-rebase-autosquash.sh +++ b/t/t3415-rebase-autosquash.sh @@ -169,6 +169,30 @@ test_expect_success 'auto squash that matches longer sha1' ' test 1 = $(git cat-file commit HEAD^ | grep squash | wc -l) ' +test_expect_success 'auto fixup with --name-rev' ' + git reset --hard base && + echo 2 >file1 && + git add -u && + test_tick && + git commit -m "changing file1" && + echo 4 >file2 && + git add -u && + test_tick && + git commit -m "changing file2" && + echo 1 >file1 && + git add -u && + test_tick && + git commit -m "fixup! changing file1" && + git tag final-fixup-name-rev && + test_tick && + git rebase -i --autosquash --name-rev HEAD^^^ && + git log --oneline base..HEAD >actual && + test 2 = $(wc -l <actual) && + git diff --exit-code final-fixup-name-rev && + test 2 = "$(git cat-file blob HEAD^:file2)" && + test 1 = $(git cat-file commit HEAD^ | grep changing | wc -l) +' + test_auto_commit_flags () { git reset --hard base && echo 1 >file1 && -- 1.7.7.3 -- 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