The to-do list command `squash` and its close relative `fixup` replay
the changes of a commit like `pick` but do not recreate the commit.
Instead they replace the previous commit with a new commit that also
introduces the changes of the squashed commit. This is roughly like
cherry-picking without committing and using git-commit to amend the
previous commit.

The to-do list

    pick   a Some changes
    squash b Some more changes

gets translated into the sequence of git commands

    git cherry-pick a
    git cherry-pick -n b
    git commit --amend

and if git-cherry-pick supported `--amend` this would look even more
like the to-do list it is based on

    git cherry-pick a
    git cherry-pick --amend b.

Since `do_pick` takes care of `pick` entries and the above suggests
`squash` as an alias for `pick --amend`, reimplement `squash` in
terms of `do_pick --amend`. Introduce `$squash_msg` as the commit
message via the `--file` option. When the last commit of a squash
series is processed, the user is asked to review the log message.
Pass `--edit` as additional option in this case. The only difference
in the options passed to git-commit and `do_pick` is the omitted
`--no-verify`. However, `do_pick` does not execute the verification
hooks anyway because it solely replays commits and assumes that they
have been verified before.

Signed-off-by: Fabian Ruch <baf...@gmail.com>
---
 git-rebase--interactive.sh | 32 ++++++--------------------------
 1 file changed, 6 insertions(+), 26 deletions(-)

diff --git a/git-rebase--interactive.sh b/git-rebase--interactive.sh
index 614579c..6a123f0 100644
--- a/git-rebase--interactive.sh
+++ b/git-rebase--interactive.sh
@@ -626,39 +626,19 @@ do_next () {
                squash|s|fixup|f)
                        # This is an intermediate commit; its message will only 
be
                        # used in case of trouble.  So use the long version:
-                       if ! pick_one -n $sha1
-                       then
-                               git rev-parse --verify HEAD >"$amend"
-                               die_failed_squash $sha1 "Could not apply 
$sha1... $rest"
-                       fi
-                       output git commit --allow-empty-message --allow-empty \
-                               --amend --no-verify -F "$squash_msg" \
-                               ${gpg_sign_opt:+"$gpg_sign_opt"} ||
-                               die_failed_squash $sha1 "$rest"
+                       do_pick --amend -F "$squash_msg" $sha1 \
+                               || die_failed_squash $sha1 "$rest"
                        ;;
                *)
                        # This is the final command of this squash/fixup group
                        if test -f "$fixup_msg"
                        then
-                               if ! pick_one -n $sha1
-                               then
-                                       git rev-parse --verify HEAD >"$amend"
-                                       die_failed_squash $sha1 "Could not 
apply $sha1... $rest"
-                               fi
-                               output git commit --allow-empty-message 
--allow-empty \
-                                       --amend --no-verify -F "$fixup_msg" \
-                                       ${gpg_sign_opt:+"$gpg_sign_opt"} ||
-                                       die_failed_squash $sha1 "$rest"
+                               do_pick --amend -F "$fixup_msg" $sha1 \
+                                       || die_failed_squash $sha1 "$rest"
                        else
                                cp "$squash_msg" "$GIT_DIR"/SQUASH_MSG || exit
-                               if ! pick_one -n $sha1
-                               then
-                                       git rev-parse --verify HEAD >"$amend"
-                                       die_failed_squash $sha1 "Could not 
apply $sha1... $rest"
-                               fi
-                               output git commit --allow-empty --amend 
--no-pre-commit -F "$GIT_DIR"/SQUASH_MSG -e \
-                                       ${gpg_sign_opt:+"$gpg_sign_opt"} ||
-                                       die_failed_squash $sha1 "$rest"
+                               do_pick --amend -F "$GIT_DIR"/SQUASH_MSG -e 
$sha1 \
+                                       || die_failed_squash $sha1 "$rest"
                        fi
                        rm -f "$squash_msg" "$fixup_msg"
                        if test -z "$keep_empty" && is_empty_commit HEAD
-- 
2.0.1

--
To unsubscribe from this list: send the line "unsubscribe git" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Reply via email to