diff options
author | Junio C Hamano <gitster@pobox.com> | 2012-07-15 21:38:41 -0700 |
---|---|---|
committer | Junio C Hamano <gitster@pobox.com> | 2012-07-15 21:38:42 -0700 |
commit | 0cd993a778d7c14bed34f624fce46724242557ed (patch) | |
tree | cdd3284f5bd60e38751673953148793ccb1b79d1 /git-rebase--interactive.sh | |
parent | 77f3591dbbceebfd026d087709d91cd3a9b3e8a1 (diff) | |
parent | 994fd91d1fd5e9feffc88ab7db19e9c9461b4543 (diff) | |
download | git-0cd993a778d7c14bed34f624fce46724242557ed.tar.gz git-0cd993a778d7c14bed34f624fce46724242557ed.tar.xz |
Merge branch 'cw/rebase-i-root'
"git rebase [-i] --root $tip" can now be used to rewrite all the
history down to the root.
* cw/rebase-i-root:
t3404: make test 57 work with dash and others
Add tests for rebase -i --root without --onto
rebase -i: support --root without --onto
Diffstat (limited to 'git-rebase--interactive.sh')
-rw-r--r-- | git-rebase--interactive.sh | 32 |
1 files changed, 26 insertions, 6 deletions
diff --git a/git-rebase--interactive.sh b/git-rebase--interactive.sh index 3a3c38235..bef7bc044 100644 --- a/git-rebase--interactive.sh +++ b/git-rebase--interactive.sh @@ -415,6 +415,29 @@ record_in_rewritten() { esac } +do_pick () { + if test "$(git rev-parse HEAD)" = "$squash_onto" + then + # Set the correct commit message and author info on the + # sentinel root before cherry-picking the original changes + # without committing (-n). Finally, update the sentinel again + # to include these changes. If the cherry-pick results in a + # conflict, this means our behaviour is similar to a standard + # failed cherry-pick during rebase, with a dirty index to + # resolve before manually running git commit --amend then git + # rebase --continue. + git commit --allow-empty --allow-empty-message --amend \ + --no-post-rewrite -n -q -C $1 && + pick_one -n $1 && + git commit --allow-empty --allow-empty-message \ + --amend --no-post-rewrite -n -q -C $1 || + die_with_patch $1 "Could not apply $1... $2" + else + pick_one $1 || + die_with_patch $1 "Could not apply $1... $2" + fi +} + do_next () { rm -f "$msg" "$author_script" "$amend" || exit read -r command sha1 rest < "$todo" @@ -426,16 +449,14 @@ do_next () { comment_for_reflog pick mark_action_done - pick_one $sha1 || - die_with_patch $sha1 "Could not apply $sha1... $rest" + do_pick $sha1 "$rest" record_in_rewritten $sha1 ;; reword|r) comment_for_reflog reword mark_action_done - pick_one $sha1 || - die_with_patch $sha1 "Could not apply $sha1... $rest" + do_pick $sha1 "$rest" git commit --amend --no-post-rewrite || { warn "Could not amend commit after successfully picking $sha1... $rest" warn "This is most likely due to an empty commit message, or the pre-commit hook" @@ -449,8 +470,7 @@ do_next () { comment_for_reflog edit mark_action_done - pick_one $sha1 || - die_with_patch $sha1 "Could not apply $sha1... $rest" + do_pick $sha1 "$rest" warn "Stopped at $sha1... $rest" exit_with_patch $sha1 0 ;; |