Git的fast forward和no fast forward和 three way merge 以及squash(聚合)
github上上传了版本库https://github.com/ChuckGitMerge 包括merge和rebase
没时间画图,貌似也不太会用画图工具,先写了一个文字版本的
更新:2015年08月11日,使用了git for windows自带的git gui作为图片说明
动画效果
https://devblogs.microsoft.com/devops/pull-requests-with-rebase/
一、Fast Forward,No Fast Forward 和 Squash的对比
1.fast forward
假设从master分支有三个节点C1,C2,C3
从C3切出develop分支,并在develop分支上开发了C4,C5
现在切回master分支,将develop分支合并到master。默认使用fast forward,master分支会直接指向C5。master分支的节点为C1,C2,C3,C4,C5
develop分支和master分支,看起来是完全一样的
2.no fast forward
假设从master分支有三个节点C1,C2,C3
从C3切出develop分支,并在develop分支上开发了C4,C5
现在切回master分支,将develop分支合并到master。如果使用no fast forward,在master分支上会生成一个新的commit为C6。master分支的节点为C1,C2,C3,C4,C5,C6
3.squash(第一种)
第一种squash,develop分支切出之后,master分支没有新的提交
假设从master分支有三个节点C1,C2,C3
从C3切出develop分支,并在develop分支上开发了C4,C5
下面的图的情况和fast forward以及no fast forward处理之前是一样的
现在切回master分支,将develop分支合并到master。
如果使用聚合的方式进行合并的话,那么git会将develop分支上所有的commit压缩成一个新的commit为C6直接合并到master分支。
最后master分支上的节点为C1,C2,C3,C6
从版本库的分支历史记录,是无法看出develop合并到master分支上的记录的。这是squash和其他合并方式的最主要的区别。
并且master和develop还保持着相互独立
二、Three Way Merge和Squash的对比
1.three way merge
假设从master分支有三个节点C1,C2,C3
从C3切出develop分支,并在develop分支上开发了C4,C5
master分支在C3的基础上开发了C6,C7这样进行合并的话,是无法fast forward的。
合并方式:1.找到master分支的最新节点C7
2.找到develop分支的最新节点C5
3.找到master分支和develop分支的共同祖先节点C3
4.对C3,C5,C7进行三方合并,最后生成新的commitC8
2.squash(第二种)
第二种squash,develop分支切出之后,master分支也有了新的提交
假设从master分支有三个节点C1,C2,C3
从C3切出develop分支,并在develop分支上开发了C4,C5
master分支在C3的基础上开发了C6,C7这样进行合并的话
下面的图的情况和three way merge处理之前是一样的
合并方式,直接把develop上的2个结点的变化提取出来,然后直接应用在master分支上。
从版本库的分支历史记录,是无法看出develop合并到master分支上的记录的。这是squash和其他合并方式的最主要的区别。
并且master和develop还保持着相互独立
参考资料
http://www.open-open.com/lib/view/open1328069889514.html git详解之三 git分支
http://ariya.ofilabs.com/2013/09/fast-forward-git-merge.html Fast-Forward Git Merge
http://stackoverflow.com/questions/2850369/why-does-git-fast-forward-merges-by-default
作者:Chuck Lu GitHub |
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· 没有源码,如何修改代码逻辑?
· 全程不用写代码,我用AI程序员写了一个飞机大战
· DeepSeek 开源周回顾「GitHub 热点速览」
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 记一次.NET内存居高不下排查解决与启示
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
2013-12-04 怎么在VS监视DataSet类型的数据