程序员宝藏库:https://gitee.com/sharetech_lee/CS-Books-Store
git冲突是开发过程中很难避免的,对很多git初学者来说也是比较有障碍和门槛的一部分知识。
我认为要想彻底理解一个问题,首先要清楚这个问题是怎么产生的,然后才可以更加简单的解决这个问题,而且这样做还可以从根本上加深对git的用法理解,避免每次遇到时都需要反反复复的搜索答案。
下面就逐步的介绍一下,帮助大家彻底理解什么是合并冲突?如何解决合并冲突?
什么是Git合并?什么是合并冲突?
首先,Git 是一个版本控制系统,可以保存所有文件版本的历史记录。 开发者可以随时回退到任何版本并检索旧版本。
假设,创建了一个名为 abc.txt 的文件并将其推送到 Git 仓库。 此时,该文件具有与其关联的当前版本。 现在,如果你的同事更改了同一个文件并将其推回仓库,则该文件关联了一个新版本。
Git Merge 是一项功能,可让使文件的当前内容与其他先前版本保持同步。 换句话说,Git 合并可帮助你在将新更改推送到同一文件之前合并来自其他开发人员的更改。
在 Git 合并的过程中,需要理解两件事情:
- 更改:文件的两个版本之间发生了什么类型的操作? 添加或删除新内容,或更新现有内容。
- 区域:更改的区域有两种可能性。 更改发生在文件的不同区域或更改发生在文件的同一区域。 同一区域意味着开发人员围绕文件的同一位置(例如,段落、行等)进行了更改。
如果更改不同区域时,这种情况比较简单,Git 使用自动合并策略自动处理大多数这些情况。
但是当更改发生在文件的同一区域时,Git 不会执行自动合并,它会提示冲突让开发者解决。
以一个具体的例子来解释合并冲突的产生过程:
- 张三更改了文件abx.txt,然后把它提交到了远程仓库
- 李四并不知道张三改了这个文件,与此同时,它也对同一文件、同一区域做了更改
- 李四把更改推送到远程仓库,这是Git会提示版本过旧,需要更新
- 李四重新从远程仓库拉取代码更新,再次提交时会收到自动合并冲突的警告
这个过程是不是似曾相识?
这就是合并冲突以及它的产生过程,下面就来介绍如何解决合并冲突!
如何解决合并冲突?
解决合并冲突其实并不难,在90%的情况下,当你对内容变化清楚的时候就会简单很多。
接着前面的例子,李四更改abc.txt之后,本地文件就包含自己的修改和张三的修改。所以,接下来就需要选择具体的处理措施:
- 保留张三的更改并删除自己的更改
- 删除张三的更改并保留自己的更改
- 保留张三和自己的更改
- 删除张三和自己的更改
应该选择哪一个呢? 这完全取决于项目的需求。 但是,至少要保证即将发生的变化,这样才知道选择何种措施。然后才可以逐步解决冲突。
下面就来逐步解决冲突!
场景1:修改同一文件同一区域
当 Git 由于更改在同一区域中而无法执行自动合并时,它会用特殊字符指示冲突的区域,字符序列是这样的:
- <<<<<<<
- =======
- >>>>>>>
<<<<<<< 和 ======= 之间的所有内容都是你的本地更改,这些更改还不在远程存储库中。 ======= 和 >>>>>>>> 之间的所有行都是来自远程存储库或另一个分支的更改。
接着前面的例子,假如张三更改后的内容是:
- Eat
- Read
- Gym
李四更改后的内容是:
- Eat
- Read
- Sleep
合并时就会产生下面冲突:
- Eat
- Read
<<<<<<< HEAD
- Sleep
=======
- Gym
>>>>>>>
接下来就需要对比这两部分内容,做出自己的选择,应该保留哪一个或者删除哪一个,这个完全取决于业务的现实情况。
在接受了更改之后,还没有结束,还需要做如下操作:
git add <files>
git commit -m "Message"
git push
这样就解决了合并冲突。
场景2:文件在远程/其他分支被删除
在删除的文件合并冲突中,一个开发人员在一个分支中删除一个文件,而另一个开发人员在另一个分支中编辑同一个文件。 在这种情况下,你需要决定是要保留该文件还是删除它。
要将已删除的文件添加回你的分支,需要执行以下操作:
git add <file-name>
如果确定要删除这个问津啊,就执行下面操作:
git rm <file-name>
然后,就是把更改提交:
git commit -m "Message"
git push
上面2种场景就是git冲突中比较常见的现象,其实,在git使用过程中很多报错或者告警信息都提示的非常情况,我们如果能够轻松的读懂报错信息、理解基本原理以及问题发生原因,其实解决问题就是水到渠成的事情!
建议大家有空可以多浏览Github,有很多好用的开源免费工具。但是,目前Github上项目多如牛毛,而且刷榜现在也非常严重,想要找到优质的项目变得越来越难。这里,给大家推荐Github上一个非常不错的项目《DevWeekly》,这个项目每周都会精挑细选一些优质的开源项目,涵盖C++、JAVA、JavaScript、Python、Go等不同编程语言。此外,还有一些开源工具、优秀的技术文章,而且考虑到很多同学访问Github不方便的问题,我还特意同步到了Gitee,建议大家看一下:
https://gitee.com/sharetech_lee/DevWeekly
hello,大家好,我是Jackpop,重点大学本科毕业后保送到哈工大计算数学专业读研,有多年国内头部互联网、IT公司工作经验,先后从事过计算机视觉、推荐系统、后端、数据等相关工作。如果同学们在升学考研、职业规划、高考志愿、简历优化、技术学习等方面有困惑,欢迎大家前来咨询!