关于 git 合并时使用 git megre --squash 到 master 出现冲突的问题 - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
git
Pro Git
Atlassian Git Tutorial
Pro Git 简体中文翻译
GitX
Bingchunmoli
V2EX    git

关于 git 合并时使用 git megre --squash 到 master 出现冲突的问题

  •  
  •   Bingchunmoli 2024-01-07 17:08:33 +08:00 1942 次点击
    这是一个创建于 652 天前的主题,其中的信息可能已经有所发展或是发生改变。

    从 master 拉出 develop 分支开发后 megre --squash 到 master 发布 下次开发 develop 时

    使用 develop megre --squash 到 master 频繁出现冲突,合并提交也有很多历史内容,更新的版本居然也会冲突, 是哪里做的不对吗?

    github.com/bingchunmoli/moliapi github.com/bingchunmoli/quick

    12 条回复    2024-01-08 11:14:27 +08:00
    BeautifulSoap
        1
    BeautifulSoap  
       2024-01-07 20:57:19 +08:00 via Android
    megre --squash 就是这样的
    除非你每次 megre --squash 后,再把 develop 给 rebase 或者 hard reset 到最新的 master 上
    geelaw
        2
    geelaw  
       2024-01-07 21:47:21 +08:00 via iPhone
    是 merge 不是 megre 。

    在 A 上 git merge --squash B 的意思是在 A 之后建立一个 commit C ,它的 parent 是 A ,效果是 A 和 B 的 merge base 以来 B 的变化的复合。这相当于在 A 上面把 B 里面的事情重做一次再 commit ,因为 C 的 parent 没有 B (换言之,Git 认为 C 和 B 没有关系),所以继续在 B 、C 开发后再次 merge ,会导致 Git 以为 B 和 C 包含重叠的变化,于是 Git 不知道怎么办(是接受一次呢,还是接受两次呢,还是……),即冲突。

    由此可见两种解决办法:一是 B 继续开发之前重新指向 C ,于是下次 merge 的时候 B 先前的变化就不是 merge 的考虑范围了;二是采用 merge commit ,让 C 记住自己来自于 A 和 B 。
    zjp
        3
    zjp  
       2024-01-07 22:40:23 +08:00
    一开始为什么用 megre --squash 呢
    Bingchunmoli
        4
    Bingchunmoli  
    OP
       2024-01-07 23:59:00 +08:00 via Android
    @zjp 因为看晚上说 master 作为 squash 更简洁,更适合版本号管理这种,所以尝试一下
    Bingchunmoli
        5
    Bingchunmoli  
    OP
       2024-01-07 23:59:41 +08:00 via Android
    @geelaw 第一种就是 a 中的 c 记录 rebase 或者 merge 到 b 吧,第二种如何做
    geelaw
        6
    geelaw  
       2024-01-08 00:27:33 +08:00 via iPhone
    @Bingchunmoli #5 这个问题是很奇怪的,因为 merge commit 是常态,squash merge 是非常态。如果 git merge 不加 --squash 那么 Git 在默认设置下就会采用 merge commit 。

    但这些实操并不重要,随便搜索一下就知道了。我的回复想要表达的是这个:Git 中一切信息都来自于每个 commit 里面的内容和 commit 的亲子关系,任何计算(例如 merge 如何 merge )当然只能基于这些信息。Squash merge 会导致 Git 记录的信息和人类心中的信息不一样,两种解决方案无非是告诉 Git 正确信息的方法。
    yqyq1020
        7
    yqyq1020  
       2024-01-08 00:46:40 +08:00 via iPhone
    你只有一个 dev 分支不适合 squash 每次拉一条 feat 分支出来开发才比较适合 squash
    zjp
        8
    zjp  
       2024-01-08 01:18:22 +08:00 via Android   1
    megre --squash 好看的代价是要解决更多的冲突,有时甚至两边内容完全一样
    而且只有一个 dev 分支用这种方式,好像很难分辨哪个 commit 的内容已经合并了吧。一个 feat 一个分支的情况合并完就删了没问题
    nothingistrue
        9
    nothingistrue  
       2024-01-08 09:45:38 +08:00
    --squash 会修改提交,你压缩合并进去的并不是原始的 develop 分支,而是临时生成的 develop' 分支。执行 megre --squash 之后,你的分支关系实际上变成了 master 、develop'、develop 三个分叉。这三个分叉,master 先接受了 develop' 分支的合并,这时候如果你在将 develop 往 master 合并,因为 develop' 跟 develop 必然是相同的修改但不同的提交,那必然冲突。

    就算你解决了冲突,除了第一次外,你之后的每次 develop megre --squash master ,都是在重复合并相同的修改,master 的历史必然混乱。
    nothingistrue
        10
    nothingistrue  
       2024-01-08 09:54:57 +08:00
    git 多分支齐头并进时,请切记不要用任何修改提交的操作,例如 megre --squash ,例如 rebase 。

    事实上,多分支齐头并进是一项极度高端的操作,新手请勿使用这种方式,不然要么两个分支的历史都很混乱,要么像上面那样瞎胡操作导致历史更混乱。我们常见的 git 工作流,本质上都是单一主分支的形式出了主分支之外,其他分支都是合并完即作废的临时分支。rebase merge 还能通过再次 rebase 将已经合并的分支救活继续用,squash merge 之后的,原分支是彻底废了,除了删除没有其他出路。
    anonym233
        11
    anonym233  
       2024-01-08 10:22:07 +08:00
    如果想合并 dev 代码到 master 的时候整理为一个 commit ,使用 merge --squash 没有问题。但是有两个条件,在 dev 开发的时候如果要用的 master 的代码,要用 merge 而不是 rebase ;使用 merge --squash 之后,dev 分支要抛弃到,如果想继续 dev 开发,那就再最新的 master 上再重建一个 dev 分支。
    Bingchunmoli
        12
    Bingchunmoli  
    OP
       2024-01-08 11:14:27 +08:00 via Android
    @nothingistrue 因为觉得 --squash 是一种损失信息的方式,develop 去保存更多信息所以没有删除\(\),拉出 release 也是一种一样,所以单纯 merge 才是正常情况
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     5383 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 27ms UTC 05:55 PVG 13:55 LAX 22:55 JFK 01:55
    Do have faith in what you're doing.
    ubao msn 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