今天研究了一下git merge命令常用参数,并分别用简单的例子实验了一下,整理如下:

输入git merge -h可以查看相关参数:

--ff  快速合并,这个是默认的参数。如果合并过程出现冲突,Git会显示出冲突等待手动解决或者abort此次merge

--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

  4.执行:git merge --squash dev

  master:C1 ← C2 ← C5 (Merge branch 'dev')

  dev:C1 ← C2 ← C3 ←C4

第二种情况,切出后master和dev分支均有更新,这种情况是最常见的。这里为了演示冲突,在C4和C5分别对一个文件进行了修改。

eg:master:C1 ← C2 ← C4

           ↑

  dev:       C3 ← C5

  1.执行:git merge --ff dev

  这时Git会告诉你产生了冲突并列出冲突的文件,查看文件时会列出具体冲突内容,这时要先解决冲突(如果使用Intellij Idea或Eclipse等工具,可以直接选择use ours/theirs,ours代表被合并分支即master,theirs代表合并分支即dev),然后将这些修改的部分提交,再执行merge操作。

  master:C1 ← C2 ← C3 ← C5 ← C4 ← C6 (解决冲突的那次提交)

  dev:C1 ← C2 ← C3 ←C5

  那么问题来了,Git是如何知道两个文件有冲突呢?下篇文章详细说明。

  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. 关于.NET参数传递方式的思考
  2. .Net 转战 Android 4.4 日常笔记(3)--目录结构分析
  3. 【BZOJ-1218】激光炸弹 前缀和 + 枚举
  4. angularjs实战
  5. Conway's Game of Life: An Exercise in WPF, MVVM and C#
  6. JS中关于 一个关于计时器功能效果的实现
  7. UVA 11426 GCD-Extreme(II) ★ (欧拉函数)
  8. ALI OSS RequestTimeTooSkewed
  9. 1471. Tree(LCA)
  10. vs2010常用快捷方式
  11. 快学Scala第一部分
  12. SQL server 和Oracle 序列
  13. eclipse 配置scala问题-More than one scala library found in the build path
  14. Masonry适配的简单使用
  15. 【移动开发】Service类onStartCommand()返回值和参数
  16. Linux内核架构与底层--读书笔记
  17. C# 切分图片
  18. Nginx http keepalive针对客户端行为指令
  19. 【论文笔记】Learning Convolutional Neural Networks for Graphs
  20. c++ 智能指针、函数指针和指针函数

热门文章

  1. tinyxml2库的使用--MFC工程
  2. android MessageQueue入门
  3. bzoj 4002: [JLOI2015]有意义的字符串
  4. FATFS外置UNICODE GBK双向转换码表(转)
  5. BZOJ 1101 [POI2007]Zap ——Dirichlet积
  6. jstree使用小结(三)
  7. ecshop--标签数组
  8. hisi出的H264码流结构
  9. cocoaPods的安装使用 以及 Carthage
  10. linux 安装jdk及tomcat指定jdk版本推荐