mirror of
https://github.com/git/git
synced 2024-08-23 18:00:25 +00:00
![Nguyễn Thái Ngọc Duy](/assets/img/avatar_default.png)
There are occasions when you decide to abort an in-progress rebase and move on to do something else but you forget to do "git rebase --abort" first. Or the rebase has been in progress for so long you forgot about it. By the time you realize that (e.g. by starting another rebase) it's already too late to retrace your steps. The solution is normally rm -r .git/<some rebase dir> and continue with your life. But there could be two different directories for <some rebase dir> (and it obviously requires some knowledge of how rebase works), and the ".git" part could be much longer if you are not at top-dir, or in a linked worktree. And "rm -r" is very dangerous to do in .git, a mistake in there could destroy object database or other important data. Provide "git rebase --quit" for this use case, mimicking a precedent that is "git cherry-pick --quit". Signed-off-by: Nguyễn Thái Ngọc Duy <pclouds@gmail.com> Signed-off-by: Junio C Hamano <gitster@pobox.com>
127 lines
3.3 KiB
Bash
Executable file
127 lines
3.3 KiB
Bash
Executable file
#!/bin/sh
|
|
|
|
test_description='git rebase --abort tests'
|
|
|
|
. ./test-lib.sh
|
|
|
|
### Test that we handle space characters properly
|
|
work_dir="$(pwd)/test dir"
|
|
|
|
test_expect_success setup '
|
|
mkdir -p "$work_dir" &&
|
|
cd "$work_dir" &&
|
|
git init &&
|
|
echo a > a &&
|
|
git add a &&
|
|
git commit -m a &&
|
|
git branch to-rebase &&
|
|
|
|
echo b > a &&
|
|
git commit -a -m b &&
|
|
echo c > a &&
|
|
git commit -a -m c &&
|
|
|
|
git checkout to-rebase &&
|
|
echo d > a &&
|
|
git commit -a -m "merge should fail on this" &&
|
|
echo e > a &&
|
|
git commit -a -m "merge should fail on this, too" &&
|
|
git branch pre-rebase
|
|
'
|
|
|
|
testrebase() {
|
|
type=$1
|
|
dotest=$2
|
|
|
|
test_expect_success "rebase$type --abort" '
|
|
cd "$work_dir" &&
|
|
# Clean up the state from the previous one
|
|
git reset --hard pre-rebase &&
|
|
test_must_fail git rebase$type master &&
|
|
test_path_is_dir "$dotest" &&
|
|
git rebase --abort &&
|
|
test $(git rev-parse to-rebase) = $(git rev-parse pre-rebase) &&
|
|
test ! -d "$dotest"
|
|
'
|
|
|
|
test_expect_success "rebase$type --abort after --skip" '
|
|
cd "$work_dir" &&
|
|
# Clean up the state from the previous one
|
|
git reset --hard pre-rebase &&
|
|
test_must_fail git rebase$type master &&
|
|
test_path_is_dir "$dotest" &&
|
|
test_must_fail git rebase --skip &&
|
|
test $(git rev-parse HEAD) = $(git rev-parse master) &&
|
|
git rebase --abort &&
|
|
test $(git rev-parse to-rebase) = $(git rev-parse pre-rebase) &&
|
|
test ! -d "$dotest"
|
|
'
|
|
|
|
test_expect_success "rebase$type --abort after --continue" '
|
|
cd "$work_dir" &&
|
|
# Clean up the state from the previous one
|
|
git reset --hard pre-rebase &&
|
|
test_must_fail git rebase$type master &&
|
|
test_path_is_dir "$dotest" &&
|
|
echo c > a &&
|
|
echo d >> a &&
|
|
git add a &&
|
|
test_must_fail git rebase --continue &&
|
|
test $(git rev-parse HEAD) != $(git rev-parse master) &&
|
|
git rebase --abort &&
|
|
test $(git rev-parse to-rebase) = $(git rev-parse pre-rebase) &&
|
|
test ! -d "$dotest"
|
|
'
|
|
|
|
test_expect_success "rebase$type --abort does not update reflog" '
|
|
cd "$work_dir" &&
|
|
# Clean up the state from the previous one
|
|
git reset --hard pre-rebase &&
|
|
git reflog show to-rebase > reflog_before &&
|
|
test_must_fail git rebase$type master &&
|
|
git rebase --abort &&
|
|
git reflog show to-rebase > reflog_after &&
|
|
test_cmp reflog_before reflog_after &&
|
|
rm reflog_before reflog_after
|
|
'
|
|
|
|
test_expect_success 'rebase --abort can not be used with other options' '
|
|
cd "$work_dir" &&
|
|
# Clean up the state from the previous one
|
|
git reset --hard pre-rebase &&
|
|
test_must_fail git rebase$type master &&
|
|
test_must_fail git rebase -v --abort &&
|
|
test_must_fail git rebase --abort -v &&
|
|
git rebase --abort
|
|
'
|
|
}
|
|
|
|
testrebase "" .git/rebase-apply
|
|
testrebase " --merge" .git/rebase-merge
|
|
|
|
test_expect_success 'rebase --quit' '
|
|
cd "$work_dir" &&
|
|
# Clean up the state from the previous one
|
|
git reset --hard pre-rebase &&
|
|
test_must_fail git rebase master &&
|
|
test_path_is_dir .git/rebase-apply &&
|
|
head_before=$(git rev-parse HEAD) &&
|
|
git rebase --quit &&
|
|
test $(git rev-parse HEAD) = $head_before &&
|
|
test ! -d .git/rebase-apply
|
|
'
|
|
|
|
test_expect_success 'rebase --merge --quit' '
|
|
cd "$work_dir" &&
|
|
# Clean up the state from the previous one
|
|
git reset --hard pre-rebase &&
|
|
test_must_fail git rebase --merge master &&
|
|
test_path_is_dir .git/rebase-merge &&
|
|
head_before=$(git rev-parse HEAD) &&
|
|
git rebase --quit &&
|
|
test $(git rev-parse HEAD) = $head_before &&
|
|
test ! -d .git/rebase-merge
|
|
'
|
|
|
|
test_done
|