idea合并分支有两种方式:一个是merge,另一个是rebase
一.merge(合并)
现在我们有一个master分支和一个C分支,我们想把C分支合并到master上
第一步:分别update和push两个分支,保证两个分支的代码都是最新的
(为什么要push呢,只commit不push不行吗, 这个我也不清楚,还没研究到这,目前反正只要合并我都push到远程仓库)
第二步:切换到master分支
注意切换分支前一定要把C分支的改动先commit或者直接push到远程仓库,要不然你会发现切换到master分支会直接看到C分支的改动,很烦,切记这个大坑!
第三步:右键--Git--merge
第四步:选择你要合并的origin/C分支
origin 是 Git 克隆的仓库服务器的默认名字。
(为什么不选C呢,我也不知道,可能他俩本身就是一个,反正准确点就选这个origin/C分支)
第五步:有冲突解决冲突再合并,没冲突就直接合并了.
注意,将c分支合并到master分支, 不管怎么解决冲突,c分支的内容是不受影响的,改变的都是master的内容.
到此结束
下面是我的实验
C分支一但合并到master,下次合并就失效了?并不是这样的,其实你想看的那个三个页面的冲突是有条件, 必须是master分支和C分支都修改了同一行代码,这个时候,就会弹出来3个页面,让你选择.
也就是说,一行代码,在master和C合并前,merge和C都对这行代码做了改动,这个时候才会显示冲突,让你手动选择.
案例一:
C是从master分出来的,分的那一刻,他俩的初始状态是相同的,那行代码都是sout(7777),
这时master把那行代码改为了'sout(1111)', C把那行代码改为了'sout(2222)',
这个时候你把C合并到master的时候就会报冲突. 如下图:
你可以选择左边的'sout(1111)',最后点Accept Left;
也可以选右边的'sout(2222)',最后点Accept Right;
也可以选中间的sout(7777),你也可以自己去中间的代码修改成你想要的结果.最后都是点apply
案例二:
跟着案例一,就是C合并到master后,现在master是sout(7777),C是sout(2222),两个的这行代码不一样,现在我第二次把C合并到master,会发生什么情况,
注意,C第一次合并到master后,他俩的代码相较于第一次合并那刻后,都没有改动过,
你猜下,第二次C合并到master后,是否会显示冲突界面, 如果不显示冲突界面,那么这个合并的最后结果是C的sout(2222),还是master的sout(7777)呢?
结果如下::::::结果就是合并的时候C分支这个选项就直接没有了!!!!
那现在我来改动一下C分支,把sout(2222)改为sout(3333),再合并,会发生什么样子
冲突界面再次发生!!这次我选择中间的sout(2222),,结果就是第二次合并后master由sout(7777)变成了sout(2222),,,然后C分支不受影响还是sout(3333)!
然后我把C分支的sout(3333)改为和master相同的数据sout(2222)呢, 结果会是什么呢?
结果::::::结果就是直接它自己就合并了!什么冲突都没有, 也是,都是相同的代码,哪来的冲突呢.
总结:以把C合并到master后为基准,master为111,C为222
1,master分支和C分支合并后,master做修改,但是只要是C没有修改,那么C就不能合并到master分支.
2,master分支和C分支合并后,master做修改,C分支也修改,这时合并,冲突出现,
如:master由111改为555,把C由222改为333,这时合并冲突显示为555,222,333.
3,master分支和C分支合并后,master不做修改,并,只有C分支做修改,这时合并,冲突出现,
如:master为111,把C由222改为333,这时合并冲突显示为111,222,333.
4,可以看到C合并到master,那么master这一方自己想怎么改就怎么改,但是只要C分支修改了,那么就有冲突了.
5,冲突的左边永远为master现在的版本的内容,冲突的中间永远为C合并到mater后的初始未改动版本, 冲突的右边永远为C改动后的现在的版本.
7.注意,冲突 仅限于同一行的代码,而且必须满足 冲突的三个页面的数据都不同.
二.rebase(衍合)
等明天再研究,我这学习进度太慢了,妈的,因为我TM加班到8点多,到10点还要忙自己的事情,操了!!
版权归原作者 奋豆来袭 所有, 如有侵权,请联系我们删除。