so that gitlink:git-pull[1] will appropriately merge from that
        remote branch.  Note that even if this option is not set,
        this behavior can be chosen per-branch using the `--track`
-       and `--no-track` options.  This option defaults to false.
+       and `--no-track` options.  This option can have values
+       'false' (never touch the configuration), 'all' (do this
+       for all branches), or 'true' (do this only when
+       branching from a remote tracking branch), and defaults to 'true'.
 
 branch.<name>.remote::
        When in branch <name>, it tells `git fetch` which remote to fetch.
 
        set up configuration so that git-pull will automatically
        retrieve data from the remote branch.  Set the
        branch.autosetupmerge configuration variable to true if you
-       want git-checkout and git-branch to always behave as if
-       '--track' were given.
+       want git-checkout and git-branch to behave as if
+       '--track' were given when you branch from a remote
+       tracking branch.
 
 --no-track::
        When -b is given and a branch is created off a remote branch,
 
 static const char *head;
 static unsigned char head_sha1[20];
 
-static int branch_track_remotes = 1;
+static int branch_track = 1; /* 0 = none, 1 = remotes, 2 = all */
 
 static int branch_use_color;
 static char branch_colors[][COLOR_MAXLEN] = {
                color_parse(value, var, branch_colors[slot]);
                return 0;
        }
-       if (!strcmp(var, "branch.autosetupmerge"))
-               branch_track_remotes = git_config_bool(var, value);
+       if (!strcmp(var, "branch.autosetupmerge")) {
+               if (!strcmp(value, "all"))
+                       branch_track = 2;
+               else
+                       branch_track = git_config_bool(var, value);
+       }
 
        return git_default_config(var, value);
 }
        /* When branching off a remote branch, set up so that git-pull
           automatically merges from there.  So far, this is only done for
           remotes registered via .git/config.  */
-       if (real_ref && track)
+       if (real_ref && (track == 2 ||
+                               (track == 1 &&
+                                !prefixcmp(real_ref, "refs/remotes/"))))
                set_branch_defaults(name, real_ref);
 
        if (write_ref_sha1(lock, sha1, msg) < 0)
        int i;
 
        git_config(git_branch_config);
-       track = branch_track_remotes;
+       track = branch_track;
 
        for (i = 1; i < argc; i++) {
                const char *arg = argv[i];
                        break;
                }
                if (!strcmp(arg, "--track")) {
-                       track = 1;
+                       track = 2;
                        continue;
                }
                if (!strcmp(arg, "--no-track")) {
 
      test $(git config branch.my3.remote) = local &&
      test $(git config branch.my3.merge) = refs/heads/master'
 
+test_expect_success 'autosetupmerge = all' '
+       git config branch.autosetupmerge true &&
+       git branch all1 master &&
+       test -z "$(git config branch.all1.merge)" &&
+       git config branch.autosetupmerge all &&
+       git branch all2 master &&
+       test $(git config branch.all2.merge) = refs/heads/master
+'
+
 test_expect_success 'test overriding tracking setup via --no-track' \
     'git config branch.autosetupmerge true &&
      git config remote.local.url . &&