通过根据提交历史对行进行排序来合并,而不是标记冲突
Posted
技术标签:
【中文标题】通过根据提交历史对行进行排序来合并,而不是标记冲突【英文标题】:Merge by sequencing lines according to commit history, instead of marking a conflict 【发布时间】:2021-11-24 20:43:56 【问题描述】:我有两个分支master和i1:
分公司master
:
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;
【问题讨论】:
这似乎过于具体,无法构建到 Git 中。您需要一些了解 C++ 语法的工具来进行这样的自动合并。此外,您需要完全进行此更改似乎非常罕见,因此可能不值得任何人(包括您的)时间来构建和测试这样的东西。 【参考方案1】:这是非常具体的,但如果以下条件为真(并且您暗示它们为真):
提交日期时间始终代表提交应发生的顺序。 每个提交本身对一组连续的行执行相同的操作。 (这可以自动化吗?)然后,您可以使用以下算法来实现您想要的状态,而不是特定的合并策略:
-
首先从合并基础提交创建一个新分支:
git switch -c temp-branch `git merge-base master i1`
-
现在显示自合并基础以来发生的两个分支上的所有新提交。命令
git log
可以接受多个分支,并将按时间倒序显示所有提交。您可以使用--reverse
来翻转该顺序,并从每个分支的合并基础开始隔离提交。因此,这样的事情会以正确的顺序获得您需要的提交列表:
git log `git merge-base master i1`..master `git merge-base master i1`..i1 --oneline --reverse
-
现在遍历该列表,并为每次提交解析出代表您的操作的更改。 (在您的示例中添加一个新行。)以下是有关如何实现此目的的一些提示:Show changes in a commit 和 Show only changed lines。解析出更改后,您可以将此操作应用于您的文件。如本答案顶部的条件所述,您的理想方案是自动执行此操作。
不幸的是,我认为第 3 步的实施与您的特定用例密切相关。如果您可以简单地挑选列出的每个提交,那就太好了,但是在来自另一个分支的第一次提交时,您将遇到需要“以某种方式”解决的冲突。但至少与一次合并一次相比,每次提交的冲突解决将得到简化。
【讨论】:
以上是关于通过根据提交历史对行进行排序来合并,而不是标记冲突的主要内容,如果未能解决你的问题,请参考以下文章
您能否创建一个 BigQuery UDF 来生成表列表,而不是对行进行操作?