git-commit-vandalism/builtin
Ævar Arnfjörð Bjarmason 8d7b558bae checkout & worktree: introduce checkout.defaultRemote
Introduce a checkout.defaultRemote setting which can be used to
designate a remote to prefer (via checkout.defaultRemote=origin) when
running e.g. "git checkout master" to mean origin/master, even though
there's other remotes that have the "master" branch.

I want this because it's very handy to use this workflow to checkout a
repository and create a topic branch, then get back to a "master" as
retrieved from upstream:

    (
        cd /tmp &&
        rm -rf tbdiff &&
        git clone git@github.com:trast/tbdiff.git &&
        cd tbdiff &&
        git branch -m topic &&
        git checkout master
    )

That will output:

    Branch 'master' set up to track remote branch 'master' from 'origin'.
    Switched to a new branch 'master'

But as soon as a new remote is added (e.g. just to inspect something
from someone else) the DWIMery goes away:

    (
        cd /tmp &&
        rm -rf tbdiff &&
        git clone git@github.com:trast/tbdiff.git &&
        cd tbdiff &&
        git branch -m topic &&
        git remote add avar git@github.com:avar/tbdiff.git &&
        git fetch avar &&
        git checkout master
    )

Will output (without the advice output added earlier in this series):

    error: pathspec 'master' did not match any file(s) known to git.

The new checkout.defaultRemote config allows me to say that whenever
that ambiguity comes up I'd like to prefer "origin", and it'll still
work as though the only remote I had was "origin".

Also adjust the advice.checkoutAmbiguousRemoteBranchName message to
mention this new config setting to the user, the full output on my
git.git is now (the last paragraph is new):

    $ ./git --exec-path=$PWD checkout master
    error: pathspec 'master' did not match any file(s) known to git.
    hint: 'master' matched more than one remote tracking branch.
    hint: We found 26 remotes with a reference that matched. So we fell back
    hint: on trying to resolve the argument as a path, but failed there too!
    hint:
    hint: If you meant to check out a remote tracking branch on, e.g. 'origin',
    hint: you can do so by fully qualifying the name with the --track option:
    hint:
    hint:     git checkout --track origin/<name>
    hint:
    hint: If you'd like to always have checkouts of an ambiguous <name> prefer
    hint: one remote, e.g. the 'origin' remote, consider setting
    hint: checkout.defaultRemote=origin in your config.

I considered splitting this into checkout.defaultRemote and
worktree.defaultRemote, but it's probably less confusing to break our
own rules that anything shared between config should live in core.*
than have two config settings, and I couldn't come up with a short
name under core.* that made sense (core.defaultRemoteForCheckout?).

See also 70c9ac2f19 ("DWIM "git checkout frotz" to "git checkout -b
frotz origin/frotz"", 2009-10-18) which introduced this DWIM feature
to begin with, and 4e85333197 ("worktree: make add <path> <branch>
dwim", 2017-11-26) which added it to git-worktree.

Signed-off-by: Ævar Arnfjörð Bjarmason <avarab@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
2018-06-11 09:41:02 -07:00
..
add.c Merge branch 'ma/lockfile-cleanup' 2018-05-30 14:04:05 +09:00
am.c Merge branch 'nd/use-opt-int-set-f' 2018-06-01 15:06:38 +09:00
annotate.c
apply.c
archive.c correct error messages for NULL packet_read_line() 2018-02-08 12:37:30 -08:00
bisect--helper.c bisect: mention "view" as an alternative to "visualize" 2017-11-13 10:51:14 +09:00
blame.c Merge branch 'sb/blame-color' 2018-05-30 14:04:09 +09:00
branch.c Merge branch 'nd/use-opt-int-set-f' 2018-06-01 15:06:38 +09:00
bundle.c
cat-file.c Merge branch 'js/use-bug-macro' 2018-05-30 14:04:07 +09:00
check-attr.c
check-ignore.c check-ignore: fix mix of directories and other file types 2018-02-12 13:09:35 -08:00
check-mailmap.c
check-ref-format.c Merge branch 'jc/check-ref-format-oor' into maint 2017-11-15 12:04:57 +09:00
checkout-index.c parse-options: let OPT__FORCE take optional flags argument 2018-02-09 10:24:50 -08:00
checkout.c checkout & worktree: introduce checkout.defaultRemote 2018-06-11 09:41:02 -07:00
clean.c completion: use __gitcomp_builtin in _git_clean 2018-02-09 10:24:50 -08:00
clone.c Merge branch 'bw/ref-prefix-for-configured-refspec' 2018-05-30 21:51:26 +09:00
column.c column: fix off-by-one default width 2018-05-13 10:45:05 +09:00
commit-graph.c commit-graph: implement "--append" option 2018-04-11 10:43:02 +09:00
commit-tree.c sha1_file: convert assert_sha1_type to object_id 2018-03-14 09:23:49 -07:00
commit.c Merge branch 'bp/status-rename-config' 2018-05-30 14:04:07 +09:00
config.c Merge branch 'jk/config-blob-sans-repo' 2018-05-30 21:51:27 +09:00
count-objects.c packfile: convert has_sha1_pack to object_id 2018-05-02 13:59:49 +09:00
credential.c
describe.c Merge branch 'ma/lockfile-cleanup' 2018-05-30 14:04:05 +09:00
diff-files.c
diff-index.c
diff-tree.c object: rename function 'typename' to 'type_name' 2018-02-14 13:10:05 -08:00
diff.c treewide: replace maybe_tree with accessor methods 2018-04-11 10:47:16 +09:00
difftool.c Merge branch 'nd/use-opt-int-set-f' 2018-06-01 15:06:38 +09:00
fast-export.c Merge branch 'bw/ref-prefix-for-configured-refspec' 2018-05-30 21:51:26 +09:00
fetch-pack.c Merge branch 'bw/protocol-v2' 2018-05-08 15:59:16 +09:00
fetch.c Merge branch 'nd/use-opt-int-set-f' 2018-06-01 15:06:38 +09:00
fmt-merge-msg.c sha1_file: convert read_sha1_file to struct object_id 2018-03-14 09:23:50 -07:00
for-each-ref.c
fsck.c Merge branch 'bc/object-id' 2018-05-30 14:04:10 +09:00
gc.c Merge branch 'ma/lockfile-cleanup' 2018-05-30 14:04:05 +09:00
get-tar-commit-id.c
grep.c Merge branch 'nd/use-opt-int-set-f' 2018-06-01 15:06:38 +09:00
hash-object.c exec_cmd: rename to use dash in file name 2018-04-11 18:11:00 +09:00
help.c Merge branch 'nd/command-list' 2018-06-01 15:06:37 +09:00
index-pack.c Merge branch 'bc/object-id' 2018-05-30 14:04:10 +09:00
init-db.c Merge branch 'rd/init-typo' 2018-06-01 15:06:40 +09:00
interpret-trailers.c
log.c Use OPT_SET_INT_F() for cmdline option specification 2018-05-24 16:12:29 +09:00
ls-files.c Merge branch 'nd/use-opt-int-set-f' 2018-06-01 15:06:38 +09:00
ls-remote.c Merge branch 'bw/server-options' 2018-05-23 14:38:15 +09:00
ls-tree.c cache.h: add repository argument to oid_object_info 2018-04-26 10:54:27 +09:00
mailinfo.c
mailsplit.c
merge-base.c Merge branch 'ma/reduce-heads-leakfix' 2017-11-15 12:14:32 +09:00
merge-file.c
merge-index.c
merge-ours.c Merge branch 'bw/diff-opt-impl-to-bitfields' 2017-11-09 14:31:27 +09:00
merge-recursive.c
merge-tree.c exec_cmd: rename to use dash in file name 2018-04-11 18:11:00 +09:00
merge.c Merge branch 'nd/use-opt-int-set-f' 2018-06-01 15:06:38 +09:00
mktag.c replace-object: add repository argument to lookup_replace_object 2018-04-12 11:38:56 +09:00
mktree.c cache.h: add repository argument to oid_object_info 2018-04-26 10:54:27 +09:00
mv.c Merge branch 'ma/lockfile-cleanup' 2018-05-30 14:04:05 +09:00
name-rev.c Convert find_unique_abbrev* to struct object_id 2018-03-14 09:23:48 -07:00
notes.c Merge branch 'nd/use-opt-int-set-f' 2018-06-01 15:06:38 +09:00
pack-objects.c Merge branch 'nd/use-opt-int-set-f' 2018-06-01 15:06:38 +09:00
pack-redundant.c pack-redundant: convert linked lists to use struct object_id 2018-05-02 13:59:50 +09:00
pack-refs.c refs: add repository argument to get_main_ref_store 2018-04-12 11:38:56 +09:00
patch-id.c
prune-packed.c packfile: convert has_sha1_pack to object_id 2018-05-02 13:59:49 +09:00
prune.c cache.h: add repository argument to oid_object_info 2018-04-26 10:54:27 +09:00
pull.c Merge branch 'bw/ref-prefix-for-configured-refspec' 2018-05-30 21:51:26 +09:00
push.c transport: convert transport_push to take a struct refspec 2018-05-18 06:19:44 +09:00
read-tree.c lock_file: move static locks into functions 2018-05-10 14:55:40 +09:00
rebase--helper.c rebase -i: introduce --rebase-merges=[no-]rebase-cousins 2018-04-26 12:28:43 +09:00
receive-pack.c Merge branch 'bc/object-id' 2018-05-30 14:04:10 +09:00
reflog.c Merge branch 'ds/lazy-load-trees' 2018-05-23 14:38:13 +09:00
remote-ext.c
remote-fd.c
remote.c Merge branch 'bw/ref-prefix-for-configured-refspec' 2018-05-30 21:51:26 +09:00
repack.c repack: add --keep-pack option 2018-04-16 13:52:29 +09:00
replace.c Merge branch 'js/deprecate-grafts' 2018-05-23 14:38:17 +09:00
rerere.c
reset.c builtin/reset: convert use of EMPTY_TREE_SHA1_BIN 2018-05-02 13:59:52 +09:00
rev-list.c Merge branch 'bc/object-id' 2018-04-10 08:25:45 +09:00
rev-parse.c Merge branch 'en/rev-parse-invalid-range' 2018-06-01 15:06:39 +09:00
revert.c sequencer: improve config handling 2017-12-13 11:15:14 -08:00
rm.c Merge branch 'ma/lockfile-cleanup' 2018-05-30 14:04:05 +09:00
send-pack.c remote: convert match_push_refs to take a struct refspec 2018-05-18 06:19:44 +09:00
serve.c serve: introduce git-serve 2018-03-15 12:01:08 -07:00
shortlog.c Merge branch 'ps/contains-id-error-message' 2018-04-10 16:28:20 +09:00
show-branch.c Convert find_unique_abbrev* to struct object_id 2018-03-14 09:23:48 -07:00
show-ref.c Convert find_unique_abbrev* to struct object_id 2018-03-14 09:23:48 -07:00
stripspace.c
submodule--helper.c Merge branch 'bw/ref-prefix-for-configured-refspec' 2018-05-30 21:51:26 +09:00
symbolic-ref.c refs: rename constant REF_NODEREF to REF_NO_DEREF 2017-11-06 10:31:08 +09:00
tag.c Merge branch 'sb/oid-object-info' 2018-05-23 14:38:16 +09:00
unpack-file.c sha1_file: convert read_sha1_file to struct object_id 2018-03-14 09:23:50 -07:00
unpack-objects.c Sync with Git 2.17.1 2018-05-29 17:10:05 +09:00
update-index.c Merge branch 'js/use-bug-macro' 2018-05-30 14:04:07 +09:00
update-ref.c refs: rename constant REF_NODEREF to REF_NO_DEREF 2017-11-06 10:31:08 +09:00
update-server-info.c parse-options: let OPT__FORCE take optional flags argument 2018-02-09 10:24:50 -08:00
upload-archive.c
upload-pack.c Merge branch 'bw/protocol-v2' 2018-05-08 15:59:16 +09:00
var.c
verify-commit.c sha1_file: convert read_sha1_file to struct object_id 2018-03-14 09:23:50 -07:00
verify-pack.c
verify-tag.c ref-filter: use "struct object_id" consistently 2018-04-09 06:14:45 +09:00
worktree.c checkout: pass the "num_matches" up to callers 2018-06-11 09:41:01 -07:00
write-tree.c cache-tree: convert write_*_as_tree to object_id 2018-03-14 09:23:47 -07:00