giff

git merge —— 为什么比diff & patch好

℡╲_俬逩灬. 提交于 2019-12-02 21:53:06
基于开源软件做二次开发是很常见的。这类开发常常遇到的问题是,当我们已经针对开源软件做了很多修改,与上游主干版本之间已经渐行渐远;此时上游主干有了更新,此时如何把上游的更新与我们自己的修改合并起来? 假定上游主干版本为A,我们在A的基础上开发了A';此时上游主干更新到B,现在我们要做的事情就是相应更新到B'。 一个做法是用diff工具生成A'与A的差异(patch),然后在B上面应用这个patch,期望得到B'。用数学的公式表示就是: B' = B + (A' - A) ···· (i, using diff & patch) 如果使用git做版本控制,以上的做法是可行的,但不是最优的。更好的做法是 以A为基础,生成A'和B两条分支,然后执行 git checkout B; git merge A' 。有一种误解认为这个merge操作执行的就是上面的公式(i),其实不然,git merge的算法叫做3-way merge(准确的说叫recusive 3-way merge,当两个分支有多个共同父亲时它比普通3-way merge表现得更好),用公式表示如下: B' = merge(A, A', B) ···· (ii, using 3-way merge) (ii) 比 (i) 好在哪里? 用diff工具生成patch时,我们所做的每一处修改,会连同它的“定位信息”(行号