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 <[email protected]>
---
git-rebase--interactive.sh | 30 ++++++------------------------
1 file changed, 6 insertions(+), 24 deletions(-)
diff --git a/git-rebase--interactive.sh b/git-rebase--interactive.sh
index 37800be..008f3a0 100644
--- a/git-rebase--interactive.sh
+++ b/git-rebase--interactive.sh
@@ -637,37 +637,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
- do_with_author output git commit --amend --no-verify -F
"$squash_msg" \
- ${gpg_sign_opt:+"$gpg_sign_opt"} ||
- die_failed_squash $sha1 "$rest"
+ do_with_author do_pick --amend -F "$squash_msg" $sha1 \
+ || die_failed_squash $sha1 "Could not apply
$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
- do_with_author git commit --amend --no-verify
-F "$fixup_msg" \
- ${gpg_sign_opt:+"$gpg_sign_opt"} ||
- die_failed_squash $sha1 "$rest"
+ do_with_author do_pick --amend -F "$fixup_msg"
$sha1 \
+ || die_failed_squash $sha1 "Could not
apply $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
- do_with_author git commit --amend --no-verify
-F "$GIT_DIR"/SQUASH_MSG -e \
- ${gpg_sign_opt:+"$gpg_sign_opt"} ||
- die_failed_squash $sha1 "$rest"
+ do_with_author do_pick --amend -F
"$GIT_DIR"/SQUASH_MSG -e $sha1 \
+ || die_failed_squash $sha1 "Could not
apply $sha1... $rest"
fi
rm -f "$squash_msg" "$fixup_msg"
;;
--
2.0.0
--
To unsubscribe from this list: send the line "unsubscribe git" in
the body of a message to [email protected]
More majordomo info at http://vger.kernel.org/majordomo-info.html