修改开源软件以后仍保持更新同步

git merge ―― 为什么比diff + patch好

2013.2.16, 北京

本文地址: http://www.jiangyouxin.net/2013/02/16/git_merge.html

基于开源软件做二次开发是很常见的。这类开发常常遇到的问题是,当我们已经针对开源软件做了很多修改,与上游主干版本之间已经渐行渐远;此时上游主干有了更新,此时如何把上游的更新与我们自己的修改合并起来?假定上游主干版本为A,我们在A的基础上开发了A‘;此时上游主干更新到B,现在我们要做的事情就是相应更新到B‘。

一个做法是用diff工具生成A‘与A的差异(patch),然后在B上面应用这个patch,期望得到B‘。用数学的公式表示就是:

B‘ = B + (A‘ - A) ???? (i, using diff & patch)

如果使用git做版本控制,以上的做法是可行的,但不是最优的。更好的做法是以A为基础,生成A‘和B两条分支,然后执行 git checkout B; git merge A‘。有一种误解认为这个merge操作执行的就是上面的公式(i),其实不然,git merge的算法叫做3-way merge(准确的说叫recusive 3-way merge,当两个分支有多个共同父亲时它比普通3-way merge表现得更好),用公式表示如下:

B‘ = merge(A, A‘, B) ???? (ii, using 3-way merge)

(ii) 比 (i) 好在哪里?

用diff工具生成patch时,我们所做的每一处修改,会连同它的“定位信息”(行号,以及修改处前三行与后三行的原始文本)一并保存到patch中。patch被应用时,会在原文件中寻找“定位信息”,然后将修改应用。那么,当我们把 patch(A‘ - A) 在 B 上应用的时候,很有可能定位信息本身被修改了,这样patch会失败,此时需要手工修改patch文件。

3-way-merge能在很大程度上解决这个问题。对于diff & patch会失败的情况,很多时候merge能够成功;其余则会产生冲突,但修改冲突也比手工改patch更为人性化。

算法本身就不描述了,单举一个例子来说明吧:

  1. 版本A

    mkdir test
    cd test
    git init
    vi test.txt
    
    1111
    2222
    3333
    4444
    5555
    6666
    
    git add test.txt
    git commit -m "init"
    
  2. 版本A‘,位于分支b1
    git checkout -b b1
    vi test.txt  # 插入一行abcdefg,尾部增加一行bottom
    
    1111
    2222
    3333
    abcdefg
    4444
    5555
    6666
    bottom
    
    git add test.txt
    git commit -m "modified on b1"
    
  3. 版本B,位于分支b2
    git checkout master -b b2
    vi test.txt  # 顶部增加一行add top line,“2222”做了修改,尾部增加一行bottom
    
    add top line
    1111
    22222222
    3333
    4444
    5555
    6666
    bottom
    
    git add test.txt
    git commit -m "modified on b2"
    
  4. 版本B‘,使用git merge成功合并
    git checkout -b testmerge
    git merge b1
    cat test.txt # 两条分支的修改成功合并,注意尾部的bottom也只增加了一行
                 # 如果用 patch & diff 方法,
                 #   因为patch的两个定位信息(行号、上下文)都遭到了破坏
                 #   是一定不会成功的
    
    add top line
    1111
    22222222
    3333
    abcdefg
    4444
    5555
    6666
    bottom
    

从上面这个例子也可以基本看出3-way merge的算法:

  • 两个分支中如果一个分支对某处做了修改,另一个分支未修改,则保留修改
  • 两个分支如果都对某处做了修改,且修改内容相同,则保留修改(不是做两遍)

3-way merge在下面的情况下会产生冲突:

  • 两个分支如果都对某处做了修改,且修改内容不同,则产生冲突

至于什么叫“某处”,是基于文件三个版本的LCS(最长公共子序列)确定的,就不赘述了。

参考:http://www.jiangyouxin.net/2013/02/16/git_merge.html

时间: 2024-10-11 10:35:44

修改开源软件以后仍保持更新同步的相关文章

100款开源软件

不知道这些你就OUT了!100款开源软件 好的软件可以极大提高工作效率,完成一些不可能完成工作.然而我们也常常为选择哪款软件而头疼,本次为大家推出的100款软件都是经过整理分类的,而且最重要的是100款软件都是开源免费且使用于Linux环境下,大部分都可以直接从官网上下载使用.如果你完全没有接触过以下我介绍的这100款软件,我只能说一句你OUT了! 图:100款软件分类图 接下来将要介绍的100款开源应用程序,是我花了很多时间为大家整理的,这些软件对大家来说是很有用的.我希望通过这100款软件告

2015 年度新增开源软件排名TOP100

本榜单包含 2015 年开源中国新收录的 5977 款开源软件中,根据软件本身的关注度.活跃程度进行排名前 100 名的软件.从这份榜单中或许可以了解到最新业界的趋势. 1.SwitchyOmega 项目简介:SwitchyOmega 是 SwitchySharp 的新版本.这是一个 Chrome 浏览器用来切换不同代理的插件.SwitchyOmega 初次安装时会检查是否存在 SwitchySharp ,如果有的话则会自动升级设置,无须手动配置.如果您使用的是非谷歌应用商店版,或者无法自动升级

2014 年最热门的国人开发开源软件 TOP 100

不知道从什么时候开始,很多一说起国产好像就非常愤慨,其实大可不必.做开源中国六年有余,这六年时间国内的开源蓬勃发展,从一开始的使用到贡献,到推出自己很多的开源软件,而且还有很多软件被国外的认可.中国是开源不可忽视的力量. 而我们这个榜单也是从这些国人开发.主要参与开发或者基于国外开源软件进行改进并形成独立版本的软件中,根据该软件的访问.收藏.下载等多个角度,从而得出前 100 名最受欢迎的开源软件.我们所评选出来的软件并非同类型,尽管放在一起不是很科学,但我们仍希望通过我们的视角让大家对国内一些

2014 年最热门的国人开发开源软件 TOP 100 - 开源中国社区

不知道从什么时候开始,很多一说起国产好像就非常愤慨,其实大可不必.做开源中国六年有余,这六年时间国内的开源蓬勃发展,从一开始的使用到贡献,到推出自己很多的开源软件,而且还有很多软件被国外的认可.中国是开源不可忽视的力量. 而我们这个榜单也是从这些国人开发.主要参与开发或者基于国外开源软件进行改进并形成独立版本的软件中,根据该软件的访问.收藏.下载等多个角度,从而得出前 100 名最受欢迎的开源软件.我们所评选出来的软件并非同类型,尽管放在一起不是很科学,但我们仍希望通过我们的视角让大家对国内一些

2014年最热门的国人开发开源软件TOP100

2014年最热门的国人开发开源软件TOP100 不知道从什么时候开始,很多一说起国产好像就非常愤慨,其实大可不必.做开源中国六年有余,这六年时间国内的开源蓬勃发展,从一开始的使用到贡献,到推出自己很多的开源软件,而且还有很多软件被国外的认可.中国是开源不可忽视的力量. 而我们这个榜单也是从这些国人开发.主要参与开发或者基于国外开源软件进行改进并形成独立版本的软件中,根据该软件的访问.收藏.下载等多个角度,从而得出前 100 名最受欢迎的开源软件.我们所评选出来的软件并非同类型,尽管放在一起不是很

2014 年最热门的国人开发开源软件TOP 100

不知道从什么时候开始,很多一说起国产好像就非常愤慨,其实大可不必.做开源中国六年有余,这六年时间国内的开源蓬勃发展,从一开始的使用到贡献,到推出自己很多的开源软件,而且还有很多软件被国外认可.中国是开源不可忽视的力量. 而我们这个榜单也是从这些国人开发.主要参与开发或者基于国外开源软件进行改进并形成独立版本的软件中,根据该软件的访问.收藏.下载等多个角度, 从而得出前 100 名最受欢迎的开源软件.我们所评选出来的软件并非同类型,尽管放在一起不是很科学,但我们仍希望通过我们的视角让大家对国内一些

2014年国人开发的最热门的开源软件TOP 100

不知道从什么时候开始,很多一说起国产好像就非常愤慨,其实大可不必.做开源中国六年有余,这六年时间国内的开源蓬勃发展,从一开始的使用到贡献,到推出自己很多的开源软件,而且还有很多软件被国外的认可.中国是开源不可忽视的力量. 而我们这个榜单也是从这些国人开发.主要参与开发或者基于国外开源软件进行改进并形成独立版本的软件中,根据该软件的访问.收藏.下载等多个角度,从而得出前 100 名最受欢迎的开源软件.我们所评选出来的软件并非同类型,尽管放在一起不是很科学,但我们仍希望通过我们的视角让大家对国内一些

开源软件收集

http://www.7-zip.org/7-Zip 4.16 Beta : 文件压缩工具,可与Windows资源管理器集成http://a-note.sourceforge.net/A Note 4.2.1 : 可在Windows桌面放置便笺,并可提供闹钟提醒功能http://www.xs4all.nl/~edienskeAbakt 0.9 : 能够以压缩方式对文档进行备份http://www.abisource.com/Abiword 2.27 : Windows写字板的替代程序,功能有所加

用开源软件建垂直搜索引擎 转载 http://news.cnblogs.com/n/60041/

用Solr.Nutch等开源软件来构建电子元器件垂直搜索引擎涉及很多实现细节,本文结合实际应用系统对数据采集.中文搜索.结果输出.分页处理.整合数据库等重点问题提出了切实可行的解决方法. 用开源软件建垂直搜索引擎 ■ 董娅 周峻松 针对搜索引擎的各种开源技术是开源社区的一枝奇葩,它大大缩短了构建搜索应用的周期,并使得根据特定需求打造个性化应用的垂直搜索引擎系统成为可能.作为一个独立的企业搜索应用解决方案,Solr在美国的众多知名网站中得到应用,如美国最大的科技资讯类网站CNet.Solr基于高性