about summary refs log tree commit
diff options
context:
space:
mode:
authorJunio C Hamano <gitster@pobox.com>2020-03-26 17:11:21 -0700
committerJunio C Hamano <gitster@pobox.com>2020-03-26 17:11:21 -0700
commit1c56d6f57adebf2a0ac910ca62a940dc7820bb68 (patch)
treec9fc0788d428a225cfa41d6f666de7dea369e0ee
parent369ae7567a4621aa81e5c4decc27715418564ac2 (diff)
parentd18c950a69f3a24e1e3add3d9fc427641f53e12b (diff)
downloadgit-1c56d6f57adebf2a0ac910ca62a940dc7820bb68.tar.gz
"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
-rw-r--r--builtin/pull.c16
-rwxr-xr-xt/t5521-pull-options.sh22
-rwxr-xr-xt/t7601-merge-pull-config.sh38
3 files changed, 65 insertions, 11 deletions
diff --git a/builtin/pull.c b/builtin/pull.c
index 3e624d1e00..e42665b681 100644
--- a/builtin/pull.c
+++ b/builtin/pull.c
@@ -327,6 +327,22 @@ static enum rebase_type config_get_rebase(void)
         if (!git_config_get_value("pull.rebase", &value))
                 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;
 }
 
diff --git a/t/t5521-pull-options.sh b/t/t5521-pull-options.sh
index ccde8ba491..159afa7ac8 100755
--- a/t/t5521-pull-options.sh
+++ b/t/t5521-pull-options.sh
@@ -11,10 +11,10 @@ test_expect_success 'setup' '
          git commit -m one)
 '
 
-test_expect_success 'git pull -q' '
+test_expect_success 'git pull -q --no-rebase' '
         mkdir clonedq &&
         (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 out)
 '
@@ -30,10 +30,10 @@ test_expect_success 'git pull -q --rebase' '
         test_must_be_empty out)
 '
 
-test_expect_success 'git pull' '
+test_expect_success 'git pull --no-rebase' '
         mkdir cloned &&
         (cd cloned && git init &&
-        git pull "../parent" >out 2>err &&
+        git pull --no-rebase "../parent" >out 2>err &&
         test -s err &&
         test_must_be_empty out)
 '
@@ -46,10 +46,10 @@ test_expect_success 'git pull --rebase' '
         test_must_be_empty out)
 '
 
-test_expect_success 'git pull -v' '
+test_expect_success 'git pull -v --no-rebase' '
         mkdir clonedv &&
         (cd clonedv && git init &&
-        git pull -v "../parent" >out 2>err &&
+        git pull -v --no-rebase "../parent" >out 2>err &&
         test -s err &&
         test_must_be_empty out)
 '
@@ -62,25 +62,25 @@ test_expect_success 'git pull -v --rebase' '
         test_must_be_empty out)
 '
 
-test_expect_success 'git pull -v -q' '
+test_expect_success 'git pull -v -q --no-rebase' '
         mkdir clonedvq &&
         (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 err)
 '
 
-test_expect_success 'git pull -q -v' '
+test_expect_success 'git pull -q -v --no-rebase' '
         mkdir clonedqv &&
         (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 -s err)
 '
 test_expect_success 'git pull --cleanup errors early on invalid argument' '
         mkdir clonedcleanup &&
         (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 -s err)
 '
diff --git a/t/t7601-merge-pull-config.sh b/t/t7601-merge-pull-config.sh
index c6c44ec570..0f97828cd0 100755
--- a/t/t7601-merge-pull-config.sh
+++ b/t/t7601-merge-pull-config.sh
@@ -27,6 +27,44 @@ test_expect_success 'setup' '
         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' '
         git reset --hard c1 &&
         test -f c0.c &&