mirror of
https://github.com/git/git.git
synced 2024-11-27 20:14:30 +08:00
rebase -i: fix squashing corner case
When squashing, rebase -i did not prevent fast forwards. This could happen when picking some other commit than the first one, and then squashing the first commit. So do not allow fast forwards when squashing. Noticed by Johannes Sixt. Signed-off-by: Johannes Schindelin <johannes.schindelin@gmx.de> Signed-off-by: Junio C Hamano <gitster@pobox.com>
This commit is contained in:
parent
191131e538
commit
1d25c8cf82
@ -96,13 +96,14 @@ die_abort () {
|
||||
}
|
||||
|
||||
pick_one () {
|
||||
case "$1" in -n) sha1=$2 ;; *) sha1=$1 ;; esac
|
||||
no_ff=
|
||||
case "$1" in -n) sha1=$2; no_ff=t ;; *) sha1=$1 ;; esac
|
||||
output git rev-parse --verify $sha1 || die "Invalid commit name: $sha1"
|
||||
test -d "$REWRITTEN" &&
|
||||
pick_one_preserving_merges "$@" && return
|
||||
parent_sha1=$(git rev-parse --verify $sha1^ 2>/dev/null)
|
||||
current_sha1=$(git rev-parse --verify HEAD)
|
||||
if test $current_sha1 = $parent_sha1; then
|
||||
if test $no_ff$current_sha1 = $parent_sha1; then
|
||||
output git reset --hard $sha1
|
||||
test "a$1" = a-n && output git reset --soft $current_sha1
|
||||
sha1=$(git rev-parse --short $sha1)
|
||||
|
@ -264,6 +264,27 @@ test_expect_success 'interrupted squash works as expected' '
|
||||
test $one = $(git rev-parse HEAD~2)
|
||||
'
|
||||
|
||||
test_expect_success 'interrupted squash works as expected (case 2)' '
|
||||
for n in one two three four
|
||||
do
|
||||
echo $n >> conflict &&
|
||||
git add conflict &&
|
||||
git commit -m $n
|
||||
done &&
|
||||
one=$(git rev-parse HEAD~3) &&
|
||||
! FAKE_LINES="3 squash 1 2" git rebase -i HEAD~3 &&
|
||||
(echo one; echo four) > conflict &&
|
||||
git add conflict &&
|
||||
! git rebase --continue &&
|
||||
(echo one; echo two; echo four) > conflict &&
|
||||
git add conflict &&
|
||||
! git rebase --continue &&
|
||||
echo resolved > conflict &&
|
||||
git add conflict &&
|
||||
git rebase --continue &&
|
||||
test $one = $(git rev-parse HEAD~2)
|
||||
'
|
||||
|
||||
test_expect_success 'ignore patch if in upstream' '
|
||||
HEAD=$(git rev-parse HEAD) &&
|
||||
git checkout -b has-cherry-picked HEAD^ &&
|
||||
|
Loading…
Reference in New Issue
Block a user