diff --git a/Documentation/pull-fetch-param.txt b/Documentation/pull-fetch-param.txt index 6f5ca21748..18cffc25b8 100644 --- a/Documentation/pull-fetch-param.txt +++ b/Documentation/pull-fetch-param.txt @@ -75,4 +75,4 @@ ifdef::git-pull[] * A parameter without a colon merges into the current branch, endif::git-pull[] - while not storing the branch anywhere locally. + and updates the remote-tracking branches (if any). diff --git a/builtin/fetch.c b/builtin/fetch.c index 287cf4ce8b..e41cc0d733 100644 --- a/builtin/fetch.c +++ b/builtin/fetch.c @@ -160,6 +160,8 @@ static struct ref *get_ref_map(struct transport *transport, const struct ref *remote_refs = transport_get_remote_refs(transport); if (ref_count || tags == TAGS_SET) { + struct ref **old_tail; + for (i = 0; i < ref_count; i++) { get_fetch_map(remote_refs, &refs[i], &tail, 0); if (refs[i].dst && refs[i].dst[0]) @@ -170,6 +172,20 @@ static struct ref *get_ref_map(struct transport *transport, rm->fetch_head_status = FETCH_HEAD_MERGE; if (tags == TAGS_SET) get_fetch_map(remote_refs, tag_refspec, &tail, 0); + + /* + * For any refs that we happen to be fetching via command-line + * arguments, take the opportunity to update their configured + * counterparts. However, we do not want to mention these + * entries in FETCH_HEAD at all, as they would simply be + * duplicates of existing entries. + */ + old_tail = tail; + for (i = 0; i < transport->remote->fetch_refspec_nr; i++) + get_fetch_map(ref_map, &transport->remote->fetch[i], + &tail, 0); + for (rm = *old_tail; rm; rm = rm->next) + rm->fetch_head_status = FETCH_HEAD_IGNORE; } else { /* Use the defaults */ struct remote *remote = transport->remote; diff --git a/t/t5510-fetch.sh b/t/t5510-fetch.sh index 789c22827d..ff43e08755 100755 --- a/t/t5510-fetch.sh +++ b/t/t5510-fetch.sh @@ -377,7 +377,7 @@ test_expect_success 'mark initial state of origin/master' ' ) ' -test_expect_success 'explicit fetch should not update tracking' ' +test_expect_success 'explicit fetch should update tracking' ' cd "$D" && git branch -f side && @@ -387,12 +387,12 @@ test_expect_success 'explicit fetch should not update tracking' ' o=$(git rev-parse --verify refs/remotes/origin/master) && git fetch origin master && n=$(git rev-parse --verify refs/remotes/origin/master) && - test "$o" = "$n" && + test "$o" != "$n" && test_must_fail git rev-parse --verify refs/remotes/origin/side ) ' -test_expect_success 'explicit pull should not update tracking' ' +test_expect_success 'explicit pull should update tracking' ' cd "$D" && git branch -f side && @@ -402,7 +402,7 @@ test_expect_success 'explicit pull should not update tracking' ' o=$(git rev-parse --verify refs/remotes/origin/master) && git pull origin master && n=$(git rev-parse --verify refs/remotes/origin/master) && - test "$o" = "$n" && + test "$o" != "$n" && test_must_fail git rev-parse --verify refs/remotes/origin/side ) '