这两天合并一个段外来代码,这段代码并不在git库中。 于是我如下做: (1)保存当前状态,建立一个commit (2)新建一个分支test,把外来代码拷到这里,并commit (3)合并test,再删除test。 看起来没有问题,但实际错大了! 由一篇 git reset revert rebase 区别 中提过,git为每个文件保存了树状的修改信息链,这个信息链让git的合并操作更加智能,我猜测Git应该是以段为单位来记录的,但怎么个划分法,我没研究过算法,并不清楚。
具体来说, 在分支1的某代码文件中有2个函数A/B; 然后新建分支2,修改函数A->A2,再新建函数C; 回到分支1,新建分支3,修改函数B->B2,并新建函数D; 然后合并分支2和分支3,我们将在这个代码文件中得到函数A2/B2/C/D。 分支大致如下:
分支1----分支2 \ \---分支3----\ 分支3'这个过程非常智能对不?但对于我之前的操作流程,就大错特错了。因为我在第一步时保存的commit告诉Git当前的代码是最新信息,当建了一个子分支,并导入外来代码后,这个代码比之前的commit新,也就是说,Git会默认把commit中的代码当作旧代码,而被更加新的外来代码在合并时去掉!
我仔细找了Git的合并参数,然而非常无奈地发现,没有相关参数避免这一智能合并,也许是我没有找到吧。
所以,最后,只能记下这一经历,经验如下: (1)要在一个Git代码库中工作,尽量不要有外来代码 (2)如果必须合并,合并外来代码要非常小心,最好从可以确定的外来代码和库中代码没有冲突的commit-id节点开始,分出两个支,然后再合并