提问者:小点点

通过根据提交历史记录对行进行排序来合并,而不是标记冲突


我有两个分支master和i1:

分支

int main() {
    std::cout << "Hello World!";
    std::cout << "1";
    std::cout << "3";
    std::cout << "5";
    return 0;
}

分支机构i1

int main() {
    std::cout << "Hello World!";
    std::cout << "1";
    std::cout << "2";
    std::cout << "4";
    std::cout << "6";
    return 0;
}

i1合并到master时发生冲突:

int main() {
    std::cout << "Hello World!";
    std::cout << "1";
<<<<<<< HEAD
    std::cout << "2";
    std::cout << "4";
    std::cout << "6";
=======
    std::cout << "3";
    std::cout << "5";
>>>>>>> master
    return 0;
}

每次提交都是按以下顺序完成的:

    std::cout << "1";
commit master
    std::cout << "2";
commit i1
    std::cout << "3";
commit master
    std::cout << "4";
commit i1
    std::cout << "5";
commit master
    std::cout << "6";
commit i1

我确实与Meld合并:

int main() {
    std::cout << "Hello World!";
    std::cout << "1";
    std::cout << "2";
    std::cout << "4";
    std::cout << "6";
    std::cout << "3";
    std::cout << "5";
    return 0;
}

是否可以要求合并工具根据提交历史自动创建合并:

int main() {
    std::cout << "Hello World!";
    std::cout << "1";
    std::cout << "2";
    std::cout << "3";
    std::cout << "4";
    std::cout << "5";
    std::cout << "6";
    return 0;
}

共1个答案

匿名用户

这是非常具体的,但是如果以下条件为真(并且您暗示它们为真):

  • 提交日期时间始终表示提交的顺序
  • 每个提交本身对一组连续的行执行相同的操作。(这可以自动化吗?)

然后,您可以使用以下算法来实现您想要的状态,而不是特定的合并策略:

  1. 首先从合并基提交创建一个新分支:
git switch -c temp-branch `git merge-base master i1`
git log `git merge-base master i1`..master `git merge-base master i1`..i1 --oneline --reverse

不幸的是,我认为第3步的实现与您的特定用例密切相关。如果您可以简单地挑选列出的每个提交,那就太好了,但是在另一个分支的第一次提交时,您会得到一个需要“以某种方式”解决的冲突。但至少与一次性合并相比,冲突解决将在每次提交的基础上得到简化。