Merge branch 'ah/force-pull-rebase-configuration'

"git pull" learned to warn when no pull.rebase configuration
exists, and neither --[no-]rebase nor --ff-only is given (which
would result a merge).

* ah/force-pull-rebase-configuration:
  pull: warn if the user didn't say whether to rebase or to merge
This commit is contained in:
Junio C Hamano
2020-03-26 17:11:21 -07:00
3 changed files with 65 additions and 11 deletions

View File

@ -327,6 +327,22 @@ static enum rebase_type config_get_rebase(void)
if (!git_config_get_value("pull.rebase", &value)) if (!git_config_get_value("pull.rebase", &value))
return parse_config_rebase("pull.rebase", value, 1); return parse_config_rebase("pull.rebase", value, 1);
if (opt_verbosity >= 0 &&
(!opt_ff || strcmp(opt_ff, "--ff-only"))) {
warning(_("Pulling without specifying how to reconcile divergent branches is\n"
"discouraged. You can squelch this message by running one of the following\n"
"commands sometime before your next pull:\n"
"\n"
" git config pull.rebase false # merge (the default strategy)\n"
" git config pull.rebase true # rebase\n"
" git config pull.ff only # fast-forward only\n"
"\n"
"You can replace \"git config\" with \"git config --global\" to set a default\n"
"preference for all repositories. You can also pass --rebase, --no-rebase,\n"
"or --ff-only on the command line to override the configured default per\n"
"invocation.\n"));
}
return REBASE_FALSE; return REBASE_FALSE;
} }

View File

@ -11,10 +11,10 @@ test_expect_success 'setup' '
git commit -m one) git commit -m one)
' '
test_expect_success 'git pull -q' ' test_expect_success 'git pull -q --no-rebase' '
mkdir clonedq && mkdir clonedq &&
(cd clonedq && git init && (cd clonedq && git init &&
git pull -q "../parent" >out 2>err && git pull -q --no-rebase "../parent" >out 2>err &&
test_must_be_empty err && test_must_be_empty err &&
test_must_be_empty out) test_must_be_empty out)
' '
@ -30,10 +30,10 @@ test_expect_success 'git pull -q --rebase' '
test_must_be_empty out) test_must_be_empty out)
' '
test_expect_success 'git pull' ' test_expect_success 'git pull --no-rebase' '
mkdir cloned && mkdir cloned &&
(cd cloned && git init && (cd cloned && git init &&
git pull "../parent" >out 2>err && git pull --no-rebase "../parent" >out 2>err &&
test -s err && test -s err &&
test_must_be_empty out) test_must_be_empty out)
' '
@ -46,10 +46,10 @@ test_expect_success 'git pull --rebase' '
test_must_be_empty out) test_must_be_empty out)
' '
test_expect_success 'git pull -v' ' test_expect_success 'git pull -v --no-rebase' '
mkdir clonedv && mkdir clonedv &&
(cd clonedv && git init && (cd clonedv && git init &&
git pull -v "../parent" >out 2>err && git pull -v --no-rebase "../parent" >out 2>err &&
test -s err && test -s err &&
test_must_be_empty out) test_must_be_empty out)
' '
@ -62,25 +62,25 @@ test_expect_success 'git pull -v --rebase' '
test_must_be_empty out) test_must_be_empty out)
' '
test_expect_success 'git pull -v -q' ' test_expect_success 'git pull -v -q --no-rebase' '
mkdir clonedvq && mkdir clonedvq &&
(cd clonedvq && git init && (cd clonedvq && git init &&
git pull -v -q "../parent" >out 2>err && git pull -v -q --no-rebase "../parent" >out 2>err &&
test_must_be_empty out && test_must_be_empty out &&
test_must_be_empty err) test_must_be_empty err)
' '
test_expect_success 'git pull -q -v' ' test_expect_success 'git pull -q -v --no-rebase' '
mkdir clonedqv && mkdir clonedqv &&
(cd clonedqv && git init && (cd clonedqv && git init &&
git pull -q -v "../parent" >out 2>err && git pull -q -v --no-rebase "../parent" >out 2>err &&
test_must_be_empty out && test_must_be_empty out &&
test -s err) test -s err)
' '
test_expect_success 'git pull --cleanup errors early on invalid argument' ' test_expect_success 'git pull --cleanup errors early on invalid argument' '
mkdir clonedcleanup && mkdir clonedcleanup &&
(cd clonedcleanup && git init && (cd clonedcleanup && git init &&
test_must_fail git pull --cleanup invalid "../parent" >out 2>err && test_must_fail git pull --no-rebase --cleanup invalid "../parent" >out 2>err &&
test_must_be_empty out && test_must_be_empty out &&
test -s err) test -s err)
' '

View File

@ -27,6 +27,44 @@ test_expect_success 'setup' '
git tag c3 git tag c3
' '
test_expect_success 'pull.rebase not set' '
git reset --hard c0 &&
git pull . c1 2>err &&
test_i18ngrep "Pulling without specifying how to reconcile" err
'
test_expect_success 'pull.rebase not set and pull.ff=false' '
git reset --hard c0 &&
test_config pull.ff false &&
git pull . c1 2>err &&
test_i18ngrep "Pulling without specifying how to reconcile" err
'
test_expect_success 'pull.rebase not set and pull.ff=only' '
git reset --hard c0 &&
test_config pull.ff only &&
git pull . c1 2>err &&
test_i18ngrep ! "Pulling without specifying how to reconcile" err
'
test_expect_success 'pull.rebase not set and --rebase given' '
git reset --hard c0 &&
git pull --rebase . c1 2>err &&
test_i18ngrep ! "Pulling without specifying how to reconcile" err
'
test_expect_success 'pull.rebase not set and --no-rebase given' '
git reset --hard c0 &&
git pull --no-rebase . c1 2>err &&
test_i18ngrep ! "Pulling without specifying how to reconcile" err
'
test_expect_success 'pull.rebase not set and --ff-only given' '
git reset --hard c0 &&
git pull --ff-only . c1 2>err &&
test_i18ngrep ! "Pulling without specifying how to reconcile" err
'
test_expect_success 'merge c1 with c2' ' test_expect_success 'merge c1 with c2' '
git reset --hard c1 && git reset --hard c1 &&
test -f c0.c && test -f c0.c &&