赞
踩
这两天合并一个段外来代码,这段代码并不在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节点开始,分出两个支,然后再合并
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。