设为首页 收藏本站
查看: 1098|回复: 0

[经验分享] Git合并分支命令参数详解:git merge

[复制链接]

尚未签到

发表于 2018-1-12 22:57:34 | 显示全部楼层 |阅读模式
  作者:鹿丸不会多项式  出处:http://www.cnblogs.com/hechao123   转载请先与我联系。
  今天研究了一下git merge命令常用参数,并分别用简单的例子实验了一下,整理如下:
  输入命令git merge -h可以查看相关参数:
  --ff  快速合并,这个是默认的参数。如果合并过程出现冲突,Git会显示出冲突并等待手动解决
  --ff-only  只有能快速合并的情况才合并。如果合并过程出现冲突,Git会自动abort此次merge
  --no-ff  不使用快速合并。会生成一次新的提交记录,这个记录只是标识在这里进行了一次merge操作(目前还没想到应用场景)
  --squash  压缩合并。将待合并的分支的内容压缩成一个新的提交合并进来
  接下来分别模拟几种应用场景来举例说明,C代表一次提交,合并时都是将dev分支合并到master。
  第一种情况:master分支切出dev分支后没有新的提交,也就是说只有dev分支有更新,可以快速合并的情况:
  eg:master:C1 ← C2
  ↑
  dev:       C3 ← C4
  1.执行:git merge --ff dev
  master:C1 ← C2 ← C3 ← C4
  dev:C1 ← C2 ← C3 ←C4
  结果:查看git log时master分支会看到dev分支上的所有提交,此时master和dev是一样的
  2.执行:git merge --ff-only dev
  结果同上。
  3.执行:git merge --no-ff dev
  git会提示让你输入此次合并的信息,然后生成一个特殊的commit。
  master:C1 ← C2 ← C3 ← C4 ← C5 (Merge branch 'dev')
  dev:C1 ← C2 ← C3 ←C4
  结果:master分支会比dev分支多一条提交记录,也就是刚才输入犯人合并信息
  4.执行:git merge --squash dev
  master:C1 ← C2 ← C5 (Merge branch 'dev')
  dev:C1 ← C2 ← C3 ←C4
  结果:这里的C5其实是C3和C4的合并,如果只想合并dev的内容但是不需要它的提交记录就可以用这个参数
  第二种情况,切出后master和dev分支均有更新,这种情况是最常见的。这里为了演示冲突,在C4和C5分别对一个文件进行了修改。
  eg:master:C1 ← C2 ← C4
  ↑
  dev:       C3 ← C5
  1.执行:git merge --ff dev

  这时Git会告诉你产生了冲突并列出冲突的文件,查看文件时会列出具体冲突内容,这时要先解决冲突(如果使用Intellij>  master:C1 ← C2 ← C3 ← C5 ← C4 ← C6 (解决冲突的那次提交)
  dev:C1 ← C2 ← C3 ←C5
  那么问题来了,Git是如何知道两个文件有冲突呢?
  这里先说下结论,有时间再补一篇文章单独说明说明。
  大家都知道在Git里每个文件都是一个blob对象,这里先不管合并时怎么找到同一个文件在两个分支上的blob(其实如果文件没有更新,在两个分支上是指向同一个blob),假设现在已经到了比较阶段了,Git会拿两个文件来逐行进行对比,但是判定是否修改是通过相邻行来确定的。也就是说文件a的第三行修改了,Git是通过第2行和第4行的对比来判定的,不信的可以先自己做实验验证。由于篇幅原因,这里不再赘述。
  2.执行:git merge --ff-only dev
  这时Git会检测到产生了冲突,所以提示:Not possible to fast-forward, aborting.    即取消这次merge操作。
  3.执行:git merge --no-ff dev
  结果同1,不过这里在解决了冲突执行commit操作后不用再进行merge操作了。如果再执行merge操作,它会提示:Already up-to-date.
  4.执行:git merge --squash dev
  master:C1 ← C2 ← C4 ← C6 (解决冲突的那次提交)
  dev:C1 ← C2 ← C3 ←C5
  这里解决了冲突并提交之后也不用再执行merge操作了。如果再执行merge操作会有两种情况:
  a.刚才解决冲突时选用了master分支的修改,那么还是会提示有冲突需要解决。
  b.刚才解决冲突时选用了dev分支的修改,那么会提示Already up-to-date。
  对比发现,使用--squash参数时,如果有冲突,解决完冲突后只要两个分支不完全一样,再执行git merge --squash时还是会进行merge。但--no-ff就不会。

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-434446-1-1.html 上篇帖子: 版本管理工具Git(2)git的使用 下篇帖子: 如何写好 Git commit messages
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表