每个人都有使用Git管理源代码的经历,一般的流程相信都很清楚?
工作区修改代码 -> 编译通过后 git add xxx -> git commit -m 'xxxxx'? -> 合并dev和master ->git pull -> 解决冲突->push origin
今天就因为不熟悉Git Merge的逻辑所以踩坑了
有同事发现我有部分代码有功能上有重复的定义。所以帮我删除了,但是我不知道,我也删除了这块地方
typedef struct
{
INT8U FanCtrlModeCmd;
}PACKED RaefCfgSysFanCtrlModeReq_T;
typedef struct
{
INT8U CompletionCode;
}PACKED RaefCfgSysFanCtrlModeRes_T;
//set fan speed
typedef struct
{
INT8U pwm_num;
INT8U dutycycle_percent;
}PACKED RaefSetFanSpeedReq_T;
typedef struct
{
INT8U CompletionCode;
}PACKED RaefSetFanSpeedRes_T;
这两处地方分别在57行和197行,这里称为A和B
同事删除了B部分,而我删除了A部分。
最后当我pull的时候,这个文件的AB部分代码都没了。???????
最后弄了半天,才发现是因为Git的自动合并给搞没的。
原因如下:
这个git合并的貌似是对比commit对同一个文件同一个地方的操作. 比如有两Commit?,分别为Commit?1和Commit?2。这两个Commit 都来自同一个分支的Commit?0。 有一个文件O.h?这个文件在Commit?0?中有两处定义,分别为A和B。 Commit?1把A保留,没有改动任何东西。把B全部删除。 Commit?2把A全部删除,保留了B。
如果Commit?2去合并Commit?1,那么Git对比两个分支在?A和B部分的操作, 由于Commit?2删除了A,?Commit?1保留A,所以Git?自动将Commit?2的删除合并 然后Commit?2保留了B,?Commit?1删除了B??同样Git把Commit?1的删除合并到Commit?2 所以最终结果就是合并后产生的Commit?3中没有A和B 如果想要使Commit?3中有B,那么在Commit?2中不应该保留B,而是要修改B,?比如在B部分的前面加换行,这样就相当于在下一行添加了一个B,之前B的那行被修改为空白行 这样Git就不会自动合并,因为Commit?1和Commit?2在B的操作不一致,产生冲突
反正总的来说就是Git会在两个Commit里面自动的将修改合并,除非这个地方两个Commit都有改动
所以在合并前先和同事交流好,除非你们都是各自修改代码。如果涉及删除部分代码和文件,那么就要沟通一些,防止发送逻辑冲突。
|