rebase: implement --[no-]autostash and rebase.autostash
commit587947750bd73544a6a99811f0ddfd64e1ff1445
authorRamkumar Ramachandra <artagnon@gmail.com>
Sun, 12 May 2013 11:56:41 +0000 (12 17:26 +0530)
committerJunio C Hamano <gitster@pobox.com>
Wed, 29 May 2013 17:34:54 +0000 (29 10:34 -0700)
treeb26e7a4526e1e2a658e65e18da0ebde73474362f
parent01a1e6465fea95c2b4303ed6c9bd14b276456f2d
rebase: implement --[no-]autostash and rebase.autostash

This new feature allows a rebase to be executed on a dirty worktree or
index.  It works by creating a temporary "dangling merge commit" out
of the worktree and index changes (via 'git stash create'), and
automatically applying it after a successful rebase or abort.

rebase stores the SHA-1 hex of the temporary merge commit, along with
the rest of the rebase state, in either
.git/{rebase-merge,rebase-apply}/autostash depending on the kind of
rebase.  Since $state_dir is automatically removed at the end of a
successful rebase or abort, so is the autostash.

The advantage of this approach is that we do not affect the normal
stash's reflogs, making the autostash invisible to the end-user.  This
means that you can use 'git stash' during a rebase as usual.

When the autostash application results in a conflict, we push
$state_dir/autostash onto the normal stash and remove $state_dir
ending the rebase.  The user can inspect the stash, and pop or drop at
any time.

Most significantly, this feature means that a caller like pull (with
pull.rebase set to true) can easily be patched to remove the
require_clean_work_tree restriction.

Signed-off-by: Ramkumar Ramachandra <artagnon@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
Documentation/config.txt
Documentation/git-rebase.txt
git-rebase.sh
t/t3420-rebase-autostash.sh [new file with mode: 0755]