git merge 冲突_快速处理 git 合并冲突

8b40b482547a79e46756ed5c1889322c.png

我一直是在终端下使用 git 的。如果合并分支或者执行 rebase 遇到冲突,处理起来比较麻烦。今天 rebase 开发分支的时候又遇到了一堆冲突,于是就花了点时间研究如何快速处理 git 冲突。方法很简单,就是将 conflictstyle 配置改成 diff3。下面为大家细细分解。

我准备了一个演示项目,大家可以去 https://github.com/lvht/git-conflictstyle-demo 克隆。

git 的默认 conflictstylemerge,遇到冲突后(在演示项目执行 git merge feature_branch)会显示如下标记:

<<<<<<< HEAD
Alice asked her parents if she could
borrow their car. They said ok but told
=======
Alice asked her father if she could
borrow his motorbike. He said ok but told
>>>>>>> feature_branch
her she had to be back by 11pm.

这其中<<<<<<< HEAD=======之间的部分表示当前所在分支(也就是HEAD)的内容,而=======>>>>>>> feature_branch之间的部分则是 feature_branch 分支的内容。看到这个冲突就头大,因为我们无法确定要留哪一行删哪一行。

如果我们执行git config --global merge.conflictstyle diff3conflictstyle设成diff3,则结果会变成

<<<<<<< HEAD
Alice asked her parents if she could
borrow their car. They said ok but told
||||||| merged common ancestors
Alice asked her father if she could
borrow his car. He said ok but told
=======
Alice asked her father if she could
borrow his motorbike. He said ok but told
>>>>>>> feature_branch
her she had to be back by 11pm.

大家注意多出来的||||||| merged common ancestors=======之间的部分。git 在合并分支的时候用的是三路合并(3-way merge)。三路合并的关键就是找到两个分支的最新公共提交版本。在这个例子中,公共提交版本的内容就保存到了||||||| merged common ancestors=======之间。

很显然,master 分支将Alice asked her father if she could改成了Alice asked her parents if she could,也就是 Alice 现在要向她的父母借车;而 feature_branch 分支则将 borrow his car...改成了borrow his motorbike...,也就是不借车了,要借摩托。两者合并,最终结果应该是:

Alice asked her parents if she could
borrow their motorbike. They said ok but told
her she had to be back by 11pm.

我还找了一个例子。

cauliflower
<<<<<<< HEAD
peas
potatoes
=======
>>>>>>> topic
tomatoes

单看这种merge风格的冲突会很困惑,为什么 peas 会和空行冲突呢?如果开启了三路冲突展示,你会看到

cauliflower
<<<<<<< HEAD
peas
potatoes
||||||| merged common ancestors
peas
=======
>>>>>>> topic
tomatoes

这下就明了了,原来是 topic 分支删掉了 peas 一行,而当前分支又在 peas 下加了 potatoes 一行。所以正确的处理结果应该是只保留 potatoes。如果不开启 diff3选项,我们是很难正确处理这类冲突的。

好了,今天就说到这里。三路合并冲突你理解了吗?欢迎留言讨论。

  1. https://devblog.classy.org/git-merge-conflicts-resolution-made-easy-f44d9fbd7fec
  2. http://psung.blogspot.com/2011/02/reducing-merge-headaches-git-meets.html
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
当你使用Git进行分支合并时,有时会遇到冲突冲突发生在Git无法自动合并两个不同分支的更改时。 下面是一些处理Git冲突的步骤: 1. 首先,在合并分支之前,确保你已经保存并提交了你当前分支上的所有更改。 2. 运行`git fetch`来获取远程仓库的最新变化。 3. 确保你在要合并的目标分支上。例如,如果你想将`feature`分支合并到`master`分支上,运行`git checkout master`。 4. 运行`git merge`命令来合并两个分支。例如,运行`git merge feature`将`feature`分支合并到当前分支上。 5. 如果存在冲突Git会告诉你哪些文件发生了冲突。你可以使用命令`git status`查看文件的状态。 6. 打开发生冲突的文件,并搜索特殊标记`<<<<<<<`,`=======`和`>>>>>>>`,它们用于标识合并冲突的位置。 7. 在冲突标记之间修改文件,以解决冲突。例如,你可以选择保留其中一方的更改,或者将两者合并在一起。 8. 保存文件后,运行`git add <filename>`来将解决的文件标记为已解决。 9. 如果有多个冲突,重复步骤7和步骤8,直到所有冲突都解决完毕。 10. 运行`git commit`来提交解决冲突后的更改。Git会自动生成一个合并提交消息。 11. 最后,推送你的更改到远程仓库,运行`git push`命令。 这样,你就完成了合并冲突的过程。记住,在处理冲突时,要仔细理解和审查所有更改,确保合并后的代码是正确和无错误的。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值