Currently git merge only allows one branch when current HEAD is not yet pointing to a valid commit. This patch will allow multiple branches to be passed in, and first updates current HEAD to the first branch's head then subsequently merge the rest of the branches. --- builtin/merge.c | 57 +++++++++++++++++++++++++++++------------------------- 1 files changed, 31 insertions(+), 26 deletions(-) diff --git a/builtin/merge.c b/builtin/merge.c index d54e7dd..290e0d4 100644 --- a/builtin/merge.c +++ b/builtin/merge.c @@ -1090,9 +1090,6 @@ int cmd_merge(int argc, const char **argv, const char *prefix) * to forbid "git merge" into a branch yet to be born. * We do the same for "git pull". */ - if (argc != 1) - die(_("Can merge only exactly one commit into " - "empty head")); if (squash) die(_("Squash commit into empty head not supported yet")); if (!allow_fast_forward) @@ -1101,36 +1098,44 @@ int cmd_merge(int argc, const char **argv, const char *prefix) remote_head = peel_to_type(argv[0], 0, NULL, OBJ_COMMIT); if (!remote_head) die(_("%s - not something we can merge"), argv[0]); - read_empty(remote_head->sha1, 0); update_ref("initial pull", "HEAD", remote_head->sha1, NULL, 0, DIE_ON_ERR); - return 0; - } else { - struct strbuf merge_names = STRBUF_INIT; - /* We are invoked directly as the first-class UI. */ + if (argc < 2) + return 0; + + hashcpy(head, remote_head->sha1); + read_empty(remote_head->sha1, 0); + head_arg = argv[0]; + argc--; + argv++; + } + + struct strbuf merge_names = STRBUF_INIT; + + /* We are invoked directly as the first-class UI. */ + if(!head_invalid) head_arg = "HEAD"; - /* - * All the rest are the commits being merged; - * prepare the standard merge summary message to - * be appended to the given message. If remote - * is invalid we will die later in the common - * codepath so we discard the error in this - * loop. - */ - for (i = 0; i < argc; i++) - merge_name(argv[i], &merge_names); - - if (!have_message || shortlog_len) { - fmt_merge_msg(&merge_names, &merge_msg, !have_message, - shortlog_len); - if (merge_msg.len) - strbuf_setlen(&merge_msg, merge_msg.len - 1); - } + /* + * All the rest are the commits being merged; + * prepare the standard merge summary message to + * be appended to the given message. If remote + * is invalid we will die later in the common + * codepath so we discard the error in this + * loop. + */ + for (i = 0; i < argc; i++) + merge_name(argv[i], &merge_names); + + if (!have_message || shortlog_len) { + fmt_merge_msg(&merge_names, &merge_msg, !have_message, + shortlog_len); + if (merge_msg.len) + strbuf_setlen(&merge_msg, merge_msg.len - 1); } - if (head_invalid || !argc) + if (!argc) usage_with_options(builtin_merge_usage, builtin_merge_options); -- 1.7.3.4 -- To unsubscribe from this list: send the line "unsubscribe git" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html