I don't think that you should be forced to do it explicitely. If you want to merge in another branch, you can do that _explicitely_. So, defaulting to what most people want anyway is A Good Thing.
Here is a prototype patch to implement this functionality. One problem is that config.c does not remove cleaned sections, so after "git-branch -d mybranch" one is left with a useless "[branch "mybranch"]" section in .git/config. Other than this, it seems to work well in my experiments.
Paolo
diff --git a/builtin-branch.c b/builtin-branch.c index d0179b0..4c42825 100644 --- a/builtin-branch.c +++ b/builtin-branch.c @@ -147,8 +147,21 @@ static int delete_branches(int argc, const char **argv, int force, int kinds) error("Error deleting %sbranch '%s'", remote, argv[i]); ret = 1; - } else + } else { + if (kinds == REF_LOCAL_BRANCH) { + /* Remove git-config keys. */ + char *config_key = xmalloc(strlen(argv[i]) + 15); + sprintf(config_key, "branch.%s.remote", argv[i]); + git_config_set(config_key, NULL); + + sprintf(config_key, "branch.%s.merge", argv[i]); + git_config_set(config_key, NULL); + sprintf(config_key, "branch.%s", argv[i]); + git_config_set(config_key, NULL); + } + printf("Deleted %sbranch %s.\n", remote, argv[i]); + } } @@ -316,7 +330,7 @@ static void create_branch(const char *name, const char *start_name, struct commit *commit; unsigned char sha1[20]; char ref[PATH_MAX], msg[PATH_MAX + 20]; - int forcing = 0; + int forcing = 0, remote = 0; snprintf(ref, sizeof ref, "refs/heads/%s", name); if (check_ref_format(ref)) @@ -335,6 +349,13 @@ static void create_branch(const char *name, const char *start_name, hashcpy(sha1, start_sha1); else if (get_sha1(start_name, sha1)) die("Not a valid object name: '%s'.", start_name); + else { + unsigned char remote_sha1[20]; + remote = strchr(start_name, '/') + && read_ref(mkpath("refs/remotes/%s", start_name), + remote_sha1) != -1 + && !memcmp(sha1, remote_sha1, 20); + } if ((commit = lookup_commit_reference(sha1)) == NULL) die("Not a valid branch point: '%s'.", start_name); @@ -354,6 +375,23 @@ static void create_branch(const char *name, const char *start_name, snprintf(msg, sizeof msg, "branch: Created from %s", start_name); + if (remote) { + /* Branching off a remote branch. Set up so that git-pull + automatically merges from there. */ + char *config_key = xmalloc(strlen(name) + 15); + char *merge_value = xmalloc(strlen(start_name) + 10); + char *slash = strchr(start_name, '/'); + + char *remote_value = xstrdup(start_name); + remote_value[slash - start_name] = 0; + sprintf(config_key, "branch.%s.remote", name); + git_config_set(config_key, remote_value); + + sprintf(merge_value, "refs/heads/%s", slash + 1); + sprintf(config_key, "branch.%s.merge", name); + git_config_set(config_key, merge_value); + } + if (write_ref_sha1(lock, sha1, msg) < 0) die("Failed to write ref: %s.", strerror(errno)); }