人生不如意十之八九,分支合并不可能每次都能
fast forward
,而且不仅如此,还有可能遇到挫折:冲突。所以学会如何合理的解决冲突就是一件很重要的事情了。
我们假设要新开一个分支修复昨天努力写出来的bug,就叫他bug分支好了
git checkout -b bug
# 或者(新版本Git可用switch)
git switch -c bug
Switched 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 bug
yi~ 介四森莫~ 怎么肥四!!!
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
>>>>>>> bug
WTF!!! 是谁给我乱写乱画的?拖出去枪毙五分钟!没错,就是Git干的。那算了,还得用呢,先不枪毙了。
这个<<<<<<< HEAD
到 >>>>>>> bug
之间的部分就是出冲突的内容,而 =======
是华丽丽的分割线,上面是你当前分支的内容,下面是要合并进来的分支的内容,这两部分内容有冲突需要你解决一下。
write something
back
reset
branch dev modify
add a new feature from master branch & fix a bug from bug branch
emmm...这样貌似就好了,可以重新提交了。
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 bug
Deleted 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
之后可能会有冲突的问题,根据上面的文章,解决冲突,然后重新“三连招”即可。