rebase: save autostash entry into stash reflog on --quit

In a03b55530a (merge: teach --autostash option, 2020-04-07), the
--autostash option was introduced for `git merge`. Notably, when
`git merge --quit` is run with an autostash entry present, it is saved
into the stash reflog. This is contrasted with the current behaviour of
`git rebase --quit` where the autostash entry is simply just dropped out
of existence.

Adopt the behaviour of `git merge --quit` in `git rebase --quit` and
save the autostash entry into the stash reflog instead of just deleting
it.

Signed-off-by: Denton Liu <liu.denton@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
This commit is contained in:
Denton Liu
2020-04-28 05:31:31 -04:00
committed by Junio C Hamano
parent d9f15d37f1
commit 9b2df3e8d0
3 changed files with 23 additions and 1 deletions

View File

@ -256,7 +256,8 @@ See also INCOMPATIBLE OPTIONS below.
--quit:: --quit::
Abort the rebase operation but HEAD is not reset back to the Abort the rebase operation but HEAD is not reset back to the
original branch. The index and working tree are also left original branch. The index and working tree are also left
unchanged as a result. unchanged as a result. If a temporary stash entry was created
using --autostash, it will be saved to the stash reflog.
--apply: --apply:
Use applying strategies to rebase (calling `git-am` Use applying strategies to rebase (calling `git-am`

View File

@ -1556,6 +1556,7 @@ int cmd_rebase(int argc, const char **argv, const char *prefix)
goto cleanup; goto cleanup;
} }
case ACTION_QUIT: { case ACTION_QUIT: {
save_autostash(state_dir_path("autostash", &options));
if (options.type == REBASE_MERGE) { if (options.type == REBASE_MERGE) {
struct replay_opts replay = REPLAY_OPTS_INIT; struct replay_opts replay = REPLAY_OPTS_INIT;

View File

@ -184,6 +184,26 @@ testrebase () {
git checkout feature-branch git checkout feature-branch
' '
test_expect_success "rebase$type: --quit" '
test_config rebase.autostash true &&
git reset --hard &&
git checkout -b rebased-feature-branch feature-branch &&
test_when_finished git branch -D rebased-feature-branch &&
echo dirty >>file3 &&
git diff >expect &&
test_must_fail git rebase$type related-onto-branch &&
test_path_is_file $dotest/autostash &&
test_path_is_missing file3 &&
git rebase --quit &&
test_when_finished git stash drop &&
test_path_is_missing $dotest/autostash &&
! grep dirty file3 &&
git stash show -p >actual &&
test_cmp expect actual &&
git reset --hard &&
git checkout feature-branch
'
test_expect_success "rebase$type: non-conflicting rebase, conflicting stash" ' test_expect_success "rebase$type: non-conflicting rebase, conflicting stash" '
test_config rebase.autostash true && test_config rebase.autostash true &&
git reset --hard && git reset --hard &&