人生不如意十之八九,分支合并不可能每次都能
fast forward,而且不仅如此,还有可能遇到挫折:冲突。所以学会如何合理的解决冲突就是一件很重要的事情了。
我们假设要新开一个分支修复昨天努力写出来的bug,就叫他bug分支好了
git checkout -b bug
# 或者(新版本Git可用switch)
git switch -c bugSwitched to branch 'bug'然后我们在 README.md 文件最后添加一行 fix a bug from bug branch,然后提交
vim README.md
git add .
git commit -m 'fix a bug'我们再切换回master分支,也修改 README.md ,当然,master分支上的 README.md不可能有刚刚在bug分支上添加的文字。这时我们依然在最后添加add a new feature from master branch,同样也提交
git checkout bug
# 或者
git switch bug
vim README.md
git add .
git commit -m 'add a new feature'master和bug各自有了新的提交之后,就是这样了

好了,这时候我们将修改好的bug的bug分支合并到master分支上
git merge bugyi~ 介四森莫~ 怎么肥四!!!
Auto-merging README.md
CONFLICT (content): Merge conflict in README.md
Automatic merge failed; fix conflicts and then commit the result.然后用我蹩脚的英文读了一下,哦~,原来是冲突了,我们来看看现在的 README.md 什么样子:
write something
back
reset
branch dev modify
<<<<<<< HEAD
add a new feature from master branch
=======
fix a bug from bug branch
>>>>>>> bugWTF!!! 是谁给我乱写乱画的?拖出去枪毙五分钟!没错,就是Git干的。那算了,还得用呢,先不枪毙了。
这个<<<<<<< HEAD 到 >>>>>>> bug 之间的部分就是出冲突的内容,而 ======= 是华丽丽的分割线,上面是你当前分支的内容,下面是要合并进来的分支的内容,这两部分内容有冲突需要你解决一下。
write something
back
reset
branch dev modify
add a new feature from master branch & fix a bug from bug branchemmm...这样貌似就好了,可以重新提交了。
git add .
git commit -m 'fix conflict'[master 5f403eb] fix conflict我们看一下log
git log --graph --oneline*   5f403eb (HEAD -> master) fix conflict
|\
| * b2267c3 (bug) fix a bug
* | 4f61b16 add a new feature
|/
* 082fb4d (dev) modify file
* 7558812 (origin/master) add reset
* b86547a back
* 0e75233 first release
* f870cc5 我的第一次提交
(END)
最后,bug 分支使命完成了,就可以卸磨杀驴了。
git branch -d bugDeleted branch bug (was b2267c3).刚刚介绍了本地分支的骚操作,那么我们在从远程分支pull或者push到远程分支的时候又是什么情况呢。
其实远程分支和本地分支说白了他都是分支,没啥区别。但首先要明确一点:远程的master分支和本地的master分支属于两个分支。就好比你在GitHub上fork一样,你有一个master分支,作者也有一个master分支,但是你的提交却不在作者的分支上,当然你可以跪求作者把你写的bug合并到他的master分支上,然后让更多的人受害,哈哈。
还有就是我们平常可能接触的大多都是pull和push,那么之前讲的merge去哪了,不是要合并分支吗?这就要明确另一个点了:git pull = git fetch + git merge,也就是说其实 git pull做了两个操作,当然你也可以分开一步一步来做,所以这样就很明确了,远程分支跟本地分支的合并只是多了一步获取远程分支代码的操作。
顺便提一下“三连招”:git add && git commit && git pull,这是在 git push 之前要做的事情,顺序不能错(也不是不能,错了其实问题也不大,只是Git会告诉你,你错了,然后不答应你的请求,然后你还得乖乖的按照顺序来,因为它要保证你不会覆盖别人的代码,尽量保证不与远程分支产生冲突),其中,因为刚提到了git pull 包含了 git merge,所以在 git pull 之后可能会有冲突的问题,根据上面的文章,解决冲突,然后重新“三连招”即可。