git 中如何将子分支的多个提交作为一个提交合并到主分支? - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
git
Pro Git
Atlassian Git Tutorial
Pro Git 简体中文翻译
GitX
tiRolin
V2EX    git

git 中如何将子分支的多个提交作为一个提交合并到主分支?

  •  1
     
  •   tiRolin 56 天前 3719 次点击
    这是一个创建于 56 天前的主题,其中的信息可能已经有所发展或是发生改变。

    我们组长说从子分支到主分支一定要用变基保持 dev 的提交记录的干净,我在子分支里又喜欢写一段代码只要完成一小部分的功能就立刻提交,这样方便恢复,但是最后等变基然后合并到主分支的时候,我那一大堆提交记录也跟着带过来了,就让 dev 变得很难看,大概是这样

    我后面学着用这个压缩提交,可以将多个提交记录压缩成一个然后再合并到主分支上,但是用完之后提交记录变得更加诡异了,甚至会变成两个我有两个完全一样的提交记录,给我都整不会了,合并的时候也特别麻烦,审阅了很多东西,最后还让组长帮忙看看最终的内容有没有预期之外的修改才敢合并的,出了这事之后我就不敢再用压缩提交了

    下面是提交记录,之所以有两个一样的提交就是因为当时用了压缩提交

    后面我又跟组长学修正提交,可以修正前一个提交来解决问题,但是我用修正提交的时候有时候不知道为什么还是会触发自动合并和更新,最后虽然说可以效果没变化,但是提交记录还是变得很难看,具体来说如下图所示

    到这里为止我是真没办法,不知道该怎么解决这个问题,有没有懂得大佬来说一下,虽然说这个问题也不影响开发,但是这么乱的记录我看着心里挺膈应就是

    35 条回复    2025-08-18 11:19:53 +08:00
    tinypig
        1
    tinypig  
       56 天前
    我猜你需要的是 git-rebase
    https://git-scm.com/docs/git-rebase
    MonkeyJon
        2
    MonkeyJon  
       56 天前
    全选右键,create patch
    切换到主分支
    apply patch
    commit
    ooo4
        3
    ooo4  
       56 天前
    github 的 squash merge ?
    msg7086
        4
    msg7086  
       56 天前
    Squash merge
    hwdq0012
        5
    hwdq0012  
       56 天前
    git rebase -i 想合并到的分支~1 , 会弹出一个可编辑的文档,在上面修改 pick 为 f 表示合并到父提交, 或 s 表示 合并到父提交,并修改父提交的 commit message
    clino
        6
    clino  
       56 天前
    evan1
        7
    evan1  
    PRO
       56 天前   4
    我一般不处理,直接用 idea 过滤下就行了。

    faceRollingKB
        8
    faceRollingKB  
       56 天前
    可以用 reset 把分支重置到之前的某个点,再 force commit 覆盖 history ,缺点是这种做法有风险,建议开干之前先 checkout -b 一个备用分支以便恢复代码
    walle1530
        9
    walle1530  
       56 天前
    我本地一般一点一点的 commit ,提交整个功能的时候 git rebase -i HEAD~x ,然后 push
    或者 push 完有修改,最后 git rebase -i HEAD~x 合并一整个功能, 然后 git push --force-with-lease
    janwarlen
        10
    janwarlen  
       56 天前
    Squash merge +1
    nilaoda
        11
    nilaoda  
       56 天前
    你需要的是 squash merge 吧

    或者新开一个分支,idea 选中你原分支要合入的所有 commit ,右边会出现这些 commit 的修改文件列表,全选把变更拿到新分支上提一个 commit
    dizheyoulan
        12
    dizheyoulan  
       56 天前
    合并成一个的话,直接
    git reset --soft 2ebc134 # 软重置到第一个提交
    git commit --amend -m "新的提交信息" # 修改第一个提交
    td width="48" valign="top" align="center">momocraft
        13
    momocraft  
       56 天前
    git rebase -i

    可以自由地重排序,squash 连续的 commit 成一个,增减 commit 等
    lenglengyuchen
        14
    lenglengyuchen  
       56 天前 via Android   1
    为啥主分支要合并提交呢?我们团队是没合并,我个人也觉得保留每次的提交比较好,提交次数是会很多,变更也不连贯,但比较容易追根溯源,感觉合并之后,出问题的风险更大些,解决难度也大
    skiy
        15
    skiy  
       56 天前
    git rebase -i main

    然后使用 %s#pick#f#g 将里面的 pick 全部替换成 fixup 。再 1G 跳到第一行,将第一行的 f 改成 p 。即可。当然,你也可以选择保留 commit message 。将上述的 f 改为 s 即可(好像就是 s ?)
    cnhongwei
        16
    cnhongwei  
       56 天前
    如果是使用 idea ,不要在原分支上压缩,你在分支上开发完了,从这个分支上创建了个新分支,不要 push ,再压缩你的所有提交,再 push ,再 merge 或 rebase 到主分支。
    FlashEcho
        17
    FlashEcho  
       56 天前
    你 squash 和 commit --amend 之后是不是直接 push 了,所以出现两个一样的 commit ,这种情况应该 force push ,不然没法覆盖掉前一个
    jjwjiang
        18
    jjwjiang  
       56 天前   1
    squash 之后你自己的当前分支是废掉的了,不能继续用,因为 squash 合并的这个 commit 在你本地是不存在的,你本地是一堆合并前的 commit ,所以如果你在你这个分支继续修改提交就会出现很诡异的记录。squash 之后要新建分支,这点要注意。
    yb2313
        19
    yb2313  
       56 天前
    你是不是把已经提交的也压缩了, 我自己的使用经验是压缩只用于本地多个 commit 只做一件事的时候先压缩再推送, 然后再合并
    peakmuma
        20
    peakmuma  
       56 天前
    如果这个分支只有你自己的代码那么就本地先进行 squash merge ,
    如果这个分支之前 push 到远端过,那么新 push 需要强制推送 git push -f
    clue
        21
    clue  
       56 天前
    你们组长也奇怪,都要求用变基 (rebase) 了,结果 mr 最后又走的 merge commit 而不是 fast-forward ,搞了半天结果最后一步又放弃了 rebase 的最大优势
    chen1314
        22
    chen1314  
       56 天前
    Squash merge
    Donne
        23
    Donne  
       56 天前
    @lenglengyuchen 不合并的话根本没法看,大部分开发的时候都是频繁提交,commit 的信息也不会写的很仔细,每次看 commit ,完全找不到重点
    junbaor
        24
    junbaor  
       56 天前
    永远有人争论 rebase merge ,个人更建议多人协作时用 merge, 会保留最真实的历史记录,rebase 的优点是让 history 好看,但出问题的风险更大。
    qq362220083
        25
    qq362220083  
       56 天前
    我用小乌龟,先变基,把多个提交合并成一个提交,最后再推送。中间有冲突就解决冲突。
    Phariel
        26
    Phariel  
       56 天前
    用 Squash merge
    Rebase 我用了十几年 Git 一直敬而远之 总觉得危险
    cinlen
        27
    cinlen  
       56 天前
    每次提交采用 git commit amend 不断向上一个 commit 合并,或是 git rebase -i 然后选择要合并的多个 commit.

    采用 rebase + squash 可以得到干净的提交历史, 只是你要有能力 hold 得住这套机制。
    lianhuayu420
        28
    lianhuayu420  
       56 天前
    squash and merge
    jqtmviyu
        29
    jqtmviyu  
       56 天前
    方法 1: 用 git rebase 修改自己的本地分支, 同一个功能的 fixup

    方法 2: 新建一个功能分支, 开发完 cherry-pick 到功能子分支, 子分支再合到主分支
    lenglengyuchen
        30
    lenglengyuchen  
       55 天前
    @Donne 开发时是会提交很多次 commit ,但每次肯定不是随便提,说实话我没遇到过太多要查 commit 的场景,可能查问题时要找 commit 的人,与合并提交的 commit 没啥差别
    kongkongkong101
        31
    kongkongkong101  
       55 天前
    patch squash 二选一
    cymok
        32
    cymok  
       54 天前
    1. git rebase -i + squash
    2. 先在当前 commit 节点创建 branch 或 tag 作备份,git reset --mixed 重新按自己想要的样子一个个 add + commit ,再 rebase 过去
    harlen
        33
    harlen  
       54 天前
    以前都用 rebase -i 后面, 然后 开源节流的时候,就说你提交记录只有那一点点,无法证明你的工作量,
    现在都直接用 merge --squash
    guanzhangzhang
        34
    guanzhangzhang  
       54 天前
    自己分支上
    定期 git pull --rebase origin 主干分支名字
    提交之前 git rebase HEAD~数字 合并
    flashBee233
        35
    flashBee233  
       53 天前
    新创建一个本地分支
    再进行提交合并的操作
    最后合并到主分支
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     2897 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 25ms UTC 13:51 PVG 21:51 LAX 06:51 JFK 09:51
    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