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

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

6、 git commit           【如果不是使用 git commit -m '备注',那么 git 自动 合并 的节骨作为备注,提交本地仓库】1、 git checkout master 【进入要 合并 的分支】7、 git push             【本地仓库代码提交到远程仓库】4、 git merge dev       【使用 merge 合并 开发分支】5、 git status        【查看 合并 之后的状态】 git 命令 合并 分支代码。 在实际开发中,我们应该按照几个基本原则进行分支管理:首先,master分支应该是非常稳定的,也就是仅用来发布新版本,平时不能在上面干活;那在哪干活呢?干活都在dev分支上,也就是说,dev分支是不稳定的,到某个时候,比如1.0版本发布时,再把dev分支 合并 到master上,在master分支发布1.0版本;你和你的小伙伴们每个人都在dev分支上干活,每个人都有自己的分支,时不时地往dev分支上 合并 就可以了。所以,团队合作的分支看起来就像这样:在看具体实践前,需要了解一些理论概念,参考创建与 合并 分支:  (1)HEAD指针与分支间的关系:  (2)分支 合并 的时候,默认采用FastForward $ npm run dev 打开浏览器到localhost:5000,然后尝试递增和递减计数器。 在处理繁重的操作(例如加载大型文档或应用大量更改)时,将前端计算与后端分离是很有用的。 如果在主线程中使用统一的 Auto merge 文档,则更新 Auto merge 后端状态的操作可能会阻止UI。 通过在Webworker中运行后端操作,UI可以在状态更新时保持畅通。 从前端拆分前端时,通常会将操作传递给后端以完成操作。 完成后,它将返回可应用于前端以使其保持同步的补丁。 对于网络工作者,这种共享是通过事件消息进行的。 和中的代码显示了诸如加载文档和应用本地更改之类的操作。 这是一个简化的示例,说明如何加载文档,删除Web Wor 自动 合并 工具 Auto Merge Tool是与 git 兼容的工具,可简化 git 合并 ,变基或选择后解决冲突的过程。 使用AMT,您可以在打开首选的手动 合并 工具(meld,kdiff,win merge 等)之前,在 git 冲突中链接 自动 求解器。 它目前正在积极开发中,并在Deezer Android团队内部使用。 TL; DR; 安装AMT的最简单方法是使用pip : $ pip install auto merge tool …或使用easy\_install : $ easy_install auto merge tool 然后在您的~/. git config文件中包含以下内容: [ merge 1、 git merge 是用时间先后决定 merge 结果的,后面会覆盖前面的?答 : git 是分布式的文件版本控制系统,在分布式环境中时间是不可靠的, git 是靠三路 合并 算法进行 合并 的。2、 git merge 只要两行不相同就一定会报冲突,叫人工解决? 答: git 尽管两行内容不一样, git 会进行取舍,当 git 无法进行取舍的时候才会进行人工解决冲突 git 合并 文件是以行为单位进行一行一行进行 合并 的,但是有些时候并不是两行内容不一样 git 就会报冲突,因为smart git 会帮我们 自动 帮我们进行取舍,分析出那个 之前有了一次凌乱的 git 提交经历,虽然最后还是将代码成功 合并 了,但是最后还是踩了一个 。 历史commit中被下掉的代码居然出现在了最终的commit中。。猜想可能是下面的流程: - 之前提交mr的时候把原本要下掉的代码提交到远程分支, - 后来觉得代码有问题,本地reset到上个commit,然后把老代码下掉,增加新代码 - 再次提交时,由于两次修改的地方不一样,因此 git 判断没有 git merge 先说一下吧,做前端那么久了,其实在 合并 代码上并没有出现过什么要紧的事,无非就是 合并 代码有冲突,根据 合并 后的提示修改一下而已,但是前些日子 遇到 一个很烦的bug ,刚好下班,闲来无事,记录一下,并提供自己摸索的解决方案。问题点: git merge 后,push提示没有change-id这就很烦了,我们都知道,每次我们用 git 提交代码,都会生成一个唯一的change-id供我们使用,但... 1.出错场景: 协同开发时,我们从远程服务器上pull下代码的时候,出现以下提示信息: Auto Merge Failed; Fix Conflicts and Then Commit the Result. 2.原因分析: 利用 git status,输出如下: root@hyk-virt:/etc# git status # On bra 使用 git merge 合并 两个分支时,如果两个分支都修改了同一个文件,则会发生冲突(Conflict),并进入 合并 的中间状态。那么要如何查看冲突呢?冲突该如何解决? Git 合并 冲突:" Auto matic merge failed; fix conflicts and then commit the result." 当我们去pull代码时,突然出现needs merge 时,但是我们也并没有修改代码,也没发现冲突代码,不管是不是submodule ,这时候我们只要在主分支上 使用 git add .即可解决问题。