pull: add pull.ff configuration

Add a `pull.ff` configuration option that is analogous
to the `merge.ff` option.

This allows us to control the fast-forward behavior for
pull-initiated merges only.

Signed-off-by: David Aguilar <davvid@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
This commit is contained in:
David Aguilar 2014-01-15 15:18:38 -08:00 committed by Junio C Hamano
parent 4224916ae9
commit b814da891e
3 changed files with 46 additions and 0 deletions

View file

@ -1877,6 +1877,16 @@ pretty.<name>::
Note that an alias with the same name as a built-in format Note that an alias with the same name as a built-in format
will be silently ignored. will be silently ignored.
pull.ff::
By default, Git does not create an extra merge commit when merging
a commit that is a descendant of the current commit. Instead, the
tip of the current branch is fast-forwarded. When set to `false`,
this variable tells Git to create an extra merge commit in such
a case (equivalent to giving the `--no-ff` option from the command
line). When set to `only`, only such fast-forward merges are
allowed (equivalent to giving the `--ff-only` option from the
command line).
pull.rebase:: pull.rebase::
When true, rebase branches on top of the fetched branch, instead When true, rebase branches on top of the fetched branch, instead
of merging the default branch from the default remote when "git of merging the default branch from the default remote when "git

View file

@ -52,6 +52,21 @@ if test -z "$rebase"
then then
rebase=$(bool_or_string_config pull.rebase) rebase=$(bool_or_string_config pull.rebase)
fi fi
# Setup default fast-forward options via `pull.ff`
pull_ff=$(git config pull.ff)
case "$pull_ff" in
false)
no_ff=--no-ff
break
;;
only)
ff_only=--ff-only
break
;;
esac
dry_run= dry_run=
while : while :
do do

View file

@ -38,6 +38,27 @@ test_expect_success 'merge c1 with c2' '
test -f c2.c test -f c2.c
' '
test_expect_success 'fast-forward pull succeeds with "true" in pull.ff' '
git reset --hard c0 &&
test_config pull.ff true &&
git pull . c1 &&
test "$(git rev-parse HEAD)" = "$(git rev-parse c1)"
'
test_expect_success 'fast-forward pull creates merge with "false" in pull.ff' '
git reset --hard c0 &&
test_config pull.ff false &&
git pull . c1 &&
test "$(git rev-parse HEAD^1)" = "$(git rev-parse c0)" &&
test "$(git rev-parse HEAD^2)" = "$(git rev-parse c1)"
'
test_expect_success 'pull prevents non-fast-forward with "only" in pull.ff' '
git reset --hard c1 &&
test_config pull.ff only &&
test_must_fail git pull . c3
'
test_expect_success 'merge c1 with c2 (ours in pull.twohead)' ' test_expect_success 'merge c1 with c2 (ours in pull.twohead)' '
git reset --hard c1 && git reset --hard c1 &&
git config pull.twohead ours && git config pull.twohead ours &&