Git使用递归策略和耐心选项进行合并

时间:2011-02-17 02:17:41

标签: git

如何使用递归策略提供的耐心选项将分支与git合并?我正在使用 git版本1.7.3.1.msysgit.0

即使是文档也不一致,而且与实际命令输出的不同。

Docs say:

  

git merge [-s <strategy>] [-X <strategy-option>] <commit>

并在文中进一步说明:

  

-X <option>

(没有空格)

命令输出说:

-X, --strategy-option <option=value>

option for selected merge strategy

所以我尝试了几个版本,结果如​​下:

$ git merge -s recursive -Xpatience sourceBranch
fatal: Unknown option for merge-recursive: -Xpatience

$ git merge -X patience sourceBranch
fatal: Unknown option for merge-recursive: -Xpatience

$ git merge -Xpatience sourceBranch
fatal: Unknown option for merge-recursive: -Xpatience

$ git merge --strategy-option patience sourceBranch
fatal: Unknown option for merge-recursive: -Xpatience

$ git merge -X option=patience sourceBranch
fatal: Unknown option for merge-recursive: -Xoption=patience

$ git merge --strategy-option option=patience sourceBranch
fatal: Unknown option for merge-recursive: -Xoption=patience

$ git merge option=patience sourceBranch
fatal: 'option=patience' does not point to a commit

$ git merge -X option=patience sourceBranch
fatal: Unknown option for merge-recursive: -Xoption=patience

看起来该选项未实现......

2 个答案:

答案 0 :(得分:30)

--patience的{​​{1}}选项已在提交58a1ece478c6038a7eb0b6e494d563bd5e6d5978中引入。您可以在git merge-recursive的克隆中找到包含此更改的版本git.git

git tag --contains 58a1ece478

所以我怀疑你只是使用了一个稍微过旧版本的mSysGit。现在有1.7.4的预览版本 - 我想你应该尝试一下。

我刚刚尝试使用git 1.7.4版本,以下命令行语法适用于我:

v1.7.4
v1.7.4-rc0
v1.7.4-rc1
v1.7.4-rc2
v1.7.4-rc3
v1.7.4.1

答案 1 :(得分:3)

see here the patch在递归合并策略中引入了耐心选项,基于Git1.7.2.2,但我没有在随后的任何发行说明中看到它。

然而耐心差异算法自2009年开始提出,并且是detailed here

> grep -i patience *.c
diff.c: else if (!strcmp(arg, "--patience"))
diff.c:         DIFF_XDL_SET(options, PATIENCE_DIFF);
merge-recursive.c:      else if (!strcmp(s, "patience"))
merge-recursive.c:              o->xdl_opts |= XDF_PATIENCE_DIFF;

merge命令应该理解这个选项...但是下面的这个函数似乎永远不会被调用(不是merge-recursive.c或任何其他*.c文件中的任何地方!):

int parse_merge_opt(struct merge_options *o, const char *s)
{
    if (!s || !*s)
        return -1;
    if (!strcmp(s, "ours"))
        o->recursive_variant = MERGE_RECURSIVE_OURS;
    else if (!strcmp(s, "theirs"))
        o->recursive_variant = MERGE_RECURSIVE_THEIRS;
    else if (!strcmp(s, "subtree"))
        o->subtree_shift = "";
    else if (!prefixcmp(s, "subtree="))
        o->subtree_shift = s + strlen("subtree=");
    else if (!strcmp(s, "patience"))
        o->xdl_opts |= XDF_PATIENCE_DIFF;
    else if (!strcmp(s, "ignore-space-change"))
        o->xdl_opts |= XDF_IGNORE_WHITESPACE_CHANGE;
    else if (!strcmp(s, "ignore-all-space"))
        o->xdl_opts |= XDF_IGNORE_WHITESPACE;
    else if (!strcmp(s, "ignore-space-at-eol"))
        o->xdl_opts |= XDF_IGNORE_WHITESPACE_AT_EOL;
    else if (!strcmp(s, "renormalize"))
        o->renormalize = 1;
    else if (!strcmp(s, "no-renormalize"))
        o->renormalize = 0;
    else if (!prefixcmp(s, "rename-threshold=")) {
        const char *score = s + strlen("rename-threshold=");
        if ((o->rename_score = parse_rename_score(&score)) == -1 || *score != 0)
            return -1;
    }
    else
        return -1;
    return 0;
}

“未知选项”错误消息仅由handle_options中的git.c功能打印。
并且XDF_PATIENCE_DIFF没有在git源代码中显示任何其他内容(1.7.4)......所以是的,我不知道如何为合并实现这一点。