Git 的Auto Merge自动合并逻辑与不熟悉而遇到的坑

每个人都有使用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都有改动

所以在合并前先和同事交流好,除非你们都是各自修改代码。如果涉及删除部分代码和文件,那么就要沟通一些,防止发送逻辑冲突。

  • 2
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值