svn 迁移到 git 遇到的一个问题 - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
git
Pro Git
Atlassian Git Tutorial
Pro Git 简体中文翻译
GitX
cloudzhou
V2EX    git

svn 迁移到 git 遇到的一个问题

  •  
  •   cloudzhou 2013-11-12 18:21:59 +08:00 6856 次点击
    这是一个创建于 4349 天前的主题,其中的信息可能已经有所发展或是发生改变。
    不知道这里有没有稍大规模(10人+)使用 git 的团队成员,最近和一个长期使用svn,尝试迁移到git的团队成员沟通,发现他们在现实中遇到的问题:
    1 他们还是比较习惯在一个分支里面开发,减少了 merge 的过程,因为他们开发时候交互比较多,这样遇到一个问题,那就是类似交叉提交 commit,形成 "Merge branch 'master'",就是在 git pull 的时候自动合并了,这样的话历史记录非常的不好,没有形成干净的历史记录,对比较查看很不友好。
    2 如果分开使用分支,因为他们的开发交互非常多,比如一个人更新了一个文件,然后另外一个人需要立刻获取到这个开发结果,这样频繁的merge branch,本质上和 1 是没有太多区别的,还有提高了merge的代价。

    其他不适应的问题和git分布式概念相关,换一下思路就能解决,上面的问题有点矛盾,我想确实是一个问题。
    目前看来git比较适合模块化,程序员能非常独立的项目,如果交叉非常多,需要频繁协同(比如前端,后端,提供ajax接口然后要立刻用到),要怎么办呢?
    15 条回复    1970-01-01 08:00:00 +08:00
    cloudzhou
        1
    cloudzhou  
    OP
       2013-11-12 18:28:19 +08:00
    svn 为什么没有遇到这样的问题呢,因为 svn 是以 file 为单位,git 以 commit 为单位,对冲突的概念也不是一个定义。svn 只有在 file 同时修改才是冲突,而 git 是不允许 push fast forward,所以这就频繁合并了。
    ShadowStar
        2
    ShadowStar  
       2013-11-12 18:31:49 +08:00
    git config pull.rebase true
    czheo
        3
    czheo  
       2013-11-12 19:39:58 +08:00
    1 可以用git pull --rebase解决
    你说的问题确实存在,但git是鼓励多分branch多merge,必然造成merge commit。
    要解决你的问题,可以尝试小修正在master上直接做,用git pull --rebase。大修正开branch,正常做merge。

    或则用github/gitlab的pull request来协同作业,管理历史纪录。就不会这么在意过多的merge commit了。git的团队协作实践可以看看github flow和git-flow/hub-flow的资料。
    cloudzhou
        4
    cloudzhou  
    OP
       2013-11-12 22:31:55 +08:00
    @ShadowStar @czheo 明白你们的意思了,重点是使用 rebase 机制来
    如果模块化,开发之间协作不是那么频繁的话,我是一定推荐使用分支的方式
    gonefish
        5
    gonefish  
       2013-11-12 22:44:00 +08:00
    当采用多开branch的场景下,你应该经常把master的更新合并到你的branch中,但这种情况最好保证不要把不完整的branch合并到master中,另外merge时是不要采用fast forward,添加--no-ff。
    wxm4ever
        6
    wxm4ever  
       2013-11-12 23:15:10 +08:00
    请使用`git rebase`.并且谨记分支与master同步永远用rebase,master与分支合并用merge --no-ff.当然这并不是定律,还得根据具体的应用场景来区分。
    dancercl
        7
    dancercl  
       2013-11-13 00:17:33 +08:00
    git的最佳实践,记住2点就行了:
    1. 同一个分支内,用rebase (产生干净的历史)
    2. 不同分支之间,用merge

    更追求完美的话,还有额外的一点:
    * merge的时候如果来源分支是个短期临时分支,merge完就会删掉的,可以先squash再merge,同样可以让历史看起来干净点
    clino
        8
    clino  
       2013-11-13 09:13:30 +08:00
    git config --global --replace-all branch.autosetuprebase always
    强制在git pull的时候使用rebase方式,相当于 git pull --rebase
    standin000
        9
    standin000  
       2013-11-13 09:22:44 +08:00
    用git cherry-pick可以merge指定commit

    http://stackoverflow.com/questions/881092/how-to-merge-a-specific-commit-in-git

    另外虽然git是以commit为单位,但每个commit中尽量不要包含跨模块(文件)代码。
    williamx
        10
    williamx  
       2013-11-13 09:35:22 +08:00
    我好像并不在意 merge commit 的消息,能说说你们在意的原因吗?
    coolcfan
        11
    coolcfan  
       2013-11-13 10:50:50 +08:00
    公司产品至今源码有数万个文件,主repo上的master分支有7万5千多条commit。

    我们是采取开源项目的方式(其实本来也是开源的)大家各自fork主repo,然后建新的分支开发,master则保持跟上游一致;要做的事情完成的时候就发pull request给老大,让老大merge到他的repo里,再push到主repo中。
    charlestang
        12
    charlestang  
       2013-11-13 10:57:43 +08:00
    推荐使用git rebase。我所在的一个团队,要求每个人都使用git rebase,这样所有的commit都会记住。另外:我个人还有个习惯,就是commit merge,就是学习成本挺高,需要比较高的自觉。我每次开发某功能,随时commit,最后push之前,使用交互式 rebase,将所有的commit merge成一个commit,然后再push,这样主干上我的提交记录就会比较整洁。当然这样很容易误操作,所以也没有推广,谁会谁用。不会的也不要求了。
    HowardMei
        13
    HowardMei  
       2013-11-13 11:02:29 +08:00
    git cherry-pick +1
    各自更新很快的时候,其实可以不Commit,先拿过来用着,等到别人稳定后再拿一次
    git cherry-pick -n firstcitag
    git reset <files not stable>
    .... do your own business ....
    git cherry-pick firstcitag^..lastcitag
    这样Merge的时候一般不会有冲突
    个人感觉git cherry-pick 比 git rebase 更灵活,后者是比较大的操作
    msg7086
        14
    msg7086  
       2013-11-13 13:53:22 +08:00
    一句话: git-flow
    msg7086
        15
    msg7086  
       2013-11-13 13:58:13 +08:00
    如果是单个功能上的频繁交互开发的话,可以考虑楼上几位的建议,在branch上做squash或者cherry-pick (其实道理一样的,就是把commit给合并起来)
    等单个功能开发完了,把branch整理的好看点,然后做pull-request,review完merge回主线。
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     3880 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 26ms UTC 04:12 PVG 12:12 LAX 21:12 JFK 00:12
    Do have faith in what you're doing.
    ubao snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86