1
0
mirror of https://github.com/git/git synced 2024-07-07 19:39:27 +00:00

Merge branch 'js/rebase-i-autosquash-fix'

"git rebase -i" did not clear the state files correctly when a run
of "squash/fixup" is aborted and then the user manually amended the
commit instead, which has been corrected.

* js/rebase-i-autosquash-fix:
  rebase -i: be careful to wrap up fixup/squash chains
  rebase -i --autosquash: demonstrate a problem skipping the last squash
This commit is contained in:
Junio C Hamano 2018-09-24 10:30:45 -07:00
commit 87ae8a1a95
2 changed files with 33 additions and 3 deletions

View File

@ -3611,9 +3611,20 @@ static int commit_staged_changes(struct replay_opts *opts,
* the commit message and if there was a squash, let the user
* edit it.
*/
if (is_clean && oideq(&head, &to_amend) &&
opts->current_fixup_count > 0 &&
file_exists(rebase_path_stopped_sha())) {
if (!is_clean || !opts->current_fixup_count)
; /* this is not the final fixup */
else if (!oideq(&head, &to_amend) ||
!file_exists(rebase_path_stopped_sha())) {
/* was a final fixup or squash done manually? */
if (!is_fixup(peek_command(todo_list, 0))) {
unlink(rebase_path_fixup_msg());
unlink(rebase_path_squash_msg());
unlink(rebase_path_current_fixups());
strbuf_reset(&opts->current_fixups);
opts->current_fixup_count = 0;
}
} else {
/* we are in a fixup/squash chain */
const char *p = opts->current_fixups.buf;
int len = opts->current_fixups.len;

View File

@ -330,4 +330,23 @@ test_expect_success 'wrapped original subject' '
test $base = $parent
'
test_expect_success 'abort last squash' '
test_when_finished "test_might_fail git rebase --abort" &&
test_when_finished "git checkout master" &&
git checkout -b some-squashes &&
git commit --allow-empty -m first &&
git commit --allow-empty --squash HEAD &&
git commit --allow-empty -m second &&
git commit --allow-empty --squash HEAD &&
test_must_fail git -c core.editor="grep -q ^pick" \
rebase -ki --autosquash HEAD~4 &&
: do not finish the squash, but resolve it manually &&
git commit --allow-empty --amend -m edited-first &&
git rebase --skip &&
git show >actual &&
! grep first actual
'
test_done