每个人都有使用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都有改动
所以在合并前先和同事交流好,除非你们都是各自修改代码。如果涉及删除部分代码和文件,那么就要沟通一些,防止发送逻辑冲突。