Revert "rebase: allow starting from a dirty tree."

This reverts commit 6c9ad166db.
Allowing rebase to start in a dirty tree might have been a worthy
goal, but it is not necessarily always wanted (some people prefer
to be reminded that the state is dirty, and think about the next
action that may not be to stash and proceed).  Furthermore, depending
on the nature of local changes, unstashing the dirty state on top of
the rebased result is not always desirable.

Signed-off-by: Junio C Hamano <gitster@pobox.com>
maint
Junio C Hamano 2007-11-01 13:46:20 -07:00
parent 6c9ad166db
commit 0f49327c97
1 changed files with 14 additions and 58 deletions

View File

@ -116,30 +116,10 @@ call_merge () {
} }


finish_rb_merge () { finish_rb_merge () {
if test -f "$dotest/stash"
then
stash=$(cat "$dotest/stash")
git stash apply --index "$stash"
fi
rm -r "$dotest" rm -r "$dotest"
echo "All done." echo "All done."
} }


read_stash () {
if test -f "$1"
then
cat "$1"
fi
}
unstash_and_exit () {
err=$?
if test -f "$1" && test $err = 0
then
git stash apply --index "$1"
fi
exit $err
}

is_interactive () { is_interactive () {
test -f "$dotest"/interactive || test -f "$dotest"/interactive ||
while case $#,"$1" in 0,|*,-i|*,--interactive) break ;; esac while case $#,"$1" in 0,|*,-i|*,--interactive) break ;; esac
@ -174,9 +154,8 @@ do
finish_rb_merge finish_rb_merge
exit exit
fi fi
stash=$(read_stash ".dotest/stash")
git am --resolved --3way --resolvemsg="$RESOLVEMSG" git am --resolved --3way --resolvemsg="$RESOLVEMSG"
unstash_and_exit "$stash" exit
;; ;;
--skip) --skip)
if test -d "$dotest" if test -d "$dotest"
@ -195,31 +174,21 @@ do
finish_rb_merge finish_rb_merge
exit exit
fi fi
stash=$(read_stash ".dotest/stash")
git am -3 --skip --resolvemsg="$RESOLVEMSG" git am -3 --skip --resolvemsg="$RESOLVEMSG"
unstash_and_exit "$stash" exit
;; ;;
--abort) --abort)
git rerere clear git rerere clear
if test -d "$dotest" if test -d "$dotest"
then then
if test -f "$dotest/stash"
then
stash=$(cat "$dotest/stash")
fi
rm -r "$dotest" rm -r "$dotest"
elif test -d .dotest elif test -d .dotest
then then
if test -f ".dotest/stash"
then
stash=$(cat ".dotest/stash")
fi
rm -r .dotest rm -r .dotest
else else
die "No rebase in progress?" die "No rebase in progress?"
fi fi
git reset --hard ORIG_HEAD git reset --hard ORIG_HEAD
test -z "$stash" || git stash apply --index "$stash"
exit exit
;; ;;
--onto) --onto)
@ -285,6 +254,16 @@ else
fi fi
fi fi


# The tree must be really really clean.
git update-index --refresh || exit
diff=$(git diff-index --cached --name-status -r HEAD)
case "$diff" in
?*) echo "cannot rebase: your index is not up-to-date"
echo "$diff"
exit 1
;;
esac

# The upstream head must be given. Make sure it is valid. # The upstream head must be given. Make sure it is valid.
upstream_name="$1" upstream_name="$1"
upstream=`git rev-parse --verify "${upstream_name}^0"` || upstream=`git rev-parse --verify "${upstream_name}^0"` ||
@ -294,19 +273,11 @@ upstream=`git rev-parse --verify "${upstream_name}^0"` ||
onto_name=${newbase-"$upstream_name"} onto_name=${newbase-"$upstream_name"}
onto=$(git rev-parse --verify "${onto_name}^0") || exit onto=$(git rev-parse --verify "${onto_name}^0") || exit


# The tree must be clean enough for us to create a stash
stash=$(git stash create) || exit
if test -n "$stash"
then
echo >&2 "Stashed away your working tree changes"
fi

# If a hook exists, give it a chance to interrupt # If a hook exists, give it a chance to interrupt
if test -x "$GIT_DIR/hooks/pre-rebase" if test -x "$GIT_DIR/hooks/pre-rebase"
then then
"$GIT_DIR/hooks/pre-rebase" ${1+"$@"} || { "$GIT_DIR/hooks/pre-rebase" ${1+"$@"} || {
echo >&2 "The pre-rebase hook refused to rebase." echo >&2 "The pre-rebase hook refused to rebase."
test -z "$stash" || git stash apply --index "$stash"
exit 1 exit 1
} }
fi fi
@ -315,10 +286,7 @@ fi
case "$#" in case "$#" in
2) 2)
branch_name="$2" branch_name="$2"
git-checkout "$2" || { git-checkout "$2" || usage
test -z "$stash" || git stash apply --index "$stash"
usage
}
;; ;;
*) *)
if branch_name=`git symbolic-ref -q HEAD` if branch_name=`git symbolic-ref -q HEAD`
@ -341,7 +309,6 @@ if test "$upstream" = "$onto" && test "$mb" = "$onto" &&
! git rev-list --parents "$onto".."$branch" | grep " .* " > /dev/null ! git rev-list --parents "$onto".."$branch" | grep " .* " > /dev/null
then then
echo >&2 "Current branch $branch_name is up to date." echo >&2 "Current branch $branch_name is up to date."
test -z "$stash" || git stash apply --index "$stash"
exit 0 exit 0
fi fi


@ -361,7 +328,6 @@ git-reset --hard "$onto"
if test "$mb" = "$branch" if test "$mb" = "$branch"
then then
echo >&2 "Fast-forwarded $branch_name to $onto_name." echo >&2 "Fast-forwarded $branch_name to $onto_name."
test -z "$stash" || git stash apply --index "$stash"
exit 0 exit 0
fi fi


@ -369,16 +335,7 @@ if test -z "$do_merge"
then then
git format-patch -k --stdout --full-index --ignore-if-in-upstream "$upstream"..ORIG_HEAD | git format-patch -k --stdout --full-index --ignore-if-in-upstream "$upstream"..ORIG_HEAD |
git am $git_am_opt --binary -3 -k --resolvemsg="$RESOLVEMSG" git am $git_am_opt --binary -3 -k --resolvemsg="$RESOLVEMSG"
err=$? exit $?

if test $err = 0
then
test -z "$stash" || git stash apply --index "$stash"
exit
else
test -z "$stash" || echo "$stash" >.dotest/stash
exit $err
fi
fi fi


# start doing a rebase with git-merge # start doing a rebase with git-merge
@ -389,7 +346,6 @@ echo "$onto" > "$dotest/onto"
echo "$onto_name" > "$dotest/onto_name" echo "$onto_name" > "$dotest/onto_name"
prev_head=`git rev-parse HEAD^0` prev_head=`git rev-parse HEAD^0`
echo "$prev_head" > "$dotest/prev_head" echo "$prev_head" > "$dotest/prev_head"
test -z "$stash" || echo "$stash" >"$dotest/stash"


msgnum=0 msgnum=0
for cmt in `git rev-list --reverse --no-merges "$upstream"..ORIG_HEAD` for cmt in `git rev-list --reverse --no-merges "$upstream"..ORIG_HEAD`