请教一个 git 问题,分支里多次提交合并成一个 commit,再合并到 main 分支 - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
请不要在回答技术问题时复制粘贴 AI 生成的内容
yagamil
V2EX    程序员

请教一个 git 问题,分支里多次提交合并成一个 commit,再合并到 main 分支

  •  
  •   yagamil 2023-09-11 18:47:01 +08:00 2443 次点击
    这是一个创建于 760 天前的主题,其中的信息可能已经有所发展或是发生改变。

    请教各位 V 老师

    用网上的教程:

    1 、git checkout master 2 、git merge --squash 分支名称 3 、git commit -m '汇总后的一次 commit 内容'

    这样是可以,不过从此我的分支和 main 的就分开了。

    24 条回复    2023-09-14 10:55:56 +08:00
    adgfr32
        1
    adgfr32  
       2023-09-11 19:09:43 +08:00
    1. 在你的分支 git reset --soft hashxxx 回退到合并前的那个提交
    2. git add . + git commit -m 'xxx' + git push --force
    这样你的这个分支的后面几个提交合成一个了
    horizon
        2
    horizon  
       2023-09-11 19:15:27 +08:00   1
    git rebase
    xubeiyan
        3
    xubeiyan  
       2023-09-11 20:45:16 +08:00 via Android
    这个问题那些 git 命令行最棒的人就跟没看见一样,笑死,切到需要的分支上,用 tortoisegit 查看提交记录,多选若干个提交,压扁成一个提交,完了,再看 merge 或者 rebase 到 master 分支上
    yagamil
        4
    yagamil  
    OP
       2023-09-11 21:06:26 +08:00
    @xubeiyan 大佬们都觉得问题简单哈。。。
    hanxiV2EX
        5
    hanxiV2EX  
       2023-09-11 23:34:49 +08:00
    我只会用 git rebase -i HEAD~3 ,3 是要合并几条 commit ,然后在 vim 里编辑提交信息,会有提示的,第一条不动,其他的改成 s (squash) ,然后保存,然后再改 commit 信息就行了。
    xubeiyan
        6
    xubeiyan  
       2023-09-12 07:04:42 +08:00 via Android
    @yagamil 这种压扁提交的方式有很多种但用命令行来实现都不简单,使用图形界面就比较简单
    dayeye2006199
        7
    dayeye2006199  
       2023-09-12 09:12:04 +08:00 via Android
    rebase interactive 压一块儿
    yagamil
        8
    yagamil  
    OP
       2023-09-12 09:20:58 +08:00
    @hanxiV2EX 谢谢老哥,这样可以。
    JackyCDK
        9
    JackyCDK  
       2023-09-12 09:35:07 +08:00
    直接 rebase 呗
    hexiaowu1993
        10
    hexiaowu1993  
       2023-09-12 09:42:47 +08:00
    git reset --soft 跟 git rebase -i 都可以实现你的要求,压缩 commit 后,在强推到你特性分支,然后在合并到主分支,这样就只有一个 commit 了
    loveDiu4ever
        11
    loveDiu4ever  
       2023-09-12 10:14:11 +08:00
    rebase -i 然后根据选项进行筛选合并
    kfansup
        12
    kfansup  
       2023-09-12 10:24:34 +08:00
    rebase -i master ,然后提交前 保留一个初始 commit ,squash 其他 commit 。
    dif
        13
    dif  
       2023-09-12 10:39:06 +08:00
    不想分开就 rebase ,各有优缺点。统一规范就行。
    anonym233
        14
    anonym233  
       2023-09-12 11:01:32 +08:00
    如果多次提交基于以前的 master ,那就 git reset --soft 合并比较方便。如果多次提交不连续,那就需要 git rebase -i 调整顺序并合并。 合成一个 commit 以后,可以 git rebase master ,然后再到 master 分支下 merge 这个分支,这样的话 master 合并是无痛的,并且你的分支也是基于最新的 master ,还是紧密的联合在一起,可以继续在这个分支上开发。
    droppedbytech
        15
    droppedbytech  
       2023-09-12 11:16:56 +08:00
    @xubeiyan 不是反对你哈,我知道 gui 能这样操作,非常方便;但对习惯 git cli 的人来说,这套操作的负担和敲命令其实差不多,而且粒度还更精细,想 reword 哪个 commit 都是可以的。而且你看下面的回复都是用命令行的操作方式介绍,怎么就“跟没看见一样”呢
    shawndev
        16
    shawndev  
       2023-09-12 11:43:18 +08:00
    在你检出的新分支上,合并多次提交之后会造成哈希链表的分叉,所以所谓的分开了是必然结果。

    只是这种情况可以不必检出新分支操作,在 main 分支 rebase 之后可以选择 force push 。
    mengdodo
        17
    mengdodo  
       2023-09-12 11:58:51 +08:00
    rebase 变基的坑有人踩过没
    aroa
        18
    aroa  
       2023-09-12 14:45:21 +08:00
    @droppedbytech 你真知道?我好几个 gui 用下来只有 tortoisegit 支持这个功能
    Z5460520
        19
    Z5460520  
       2023-09-12 16:30:41 +08:00
    我不知道你是用的什么 IDE 开发工具。我用的是 pycharm 。首先确认你的当前分支。你现在肯定已经有很多个 commit_id 。现在你可以基于你的当前的分支,再新建一个分支。然后 pycharm 会直接切到你新建的分支上。然后你选择你从 master 分支切换的那个节点(非常重要),然后选择重置到那个节点。你所在的当前分支的 commit 暂存区会有你所有的改动。然后提交 commit 。你的这个新的分支就可以合成一个 commit,然后将这个新分支提交合并到主分支上了。没有什么指令。
    droppedbytech
        20
    droppedbytech  
       2023-09-12 16:52:19 +08:00
    @aroa 别的 GUI/TUI 不清楚,我只是在很久以前用过小海龟,但是 lazygit 是支持的,我感觉没道理 TUI 都支持的东西 GUI 不支持吧... 不过我还是更习惯 rebase -i ,然后自己编辑,可能我远程机开发比较多习惯了
    xubeiyan
        22
    xubeiyan  
       2023-09-12 17:53:28 +08:00 via Android
    @droppedbytech 您想想,与其去教一个 git 新手去学习 git rebase -i 这种交互式变基操作,不如直接教他用 GUI 工具快得多。你看看下面的回复,1.如果要从中间两个提交之间删怎么办?需要 rebase -i <start-commit> <end-commit> ,2.在编辑信息的时候是没法看到每个提交修改了哪个文件,除了多开 CLI 。reset 的都洗洗睡吧,不屑于和他们讨论这个问题
    Ib3b
        23
    Ib3b  
       2023-09-12 19:32:53 +08:00
    公司内部平台上有一个勾选压制提交的功能,要自己操作还真不会
    droppedbytech
        24
    droppedbytech  
       2023-09-14 10:55:56 +08:00
    @xubeiyan 这点我是同意的,GUI 对于大多数人,或者说至少是入门者/临时使用一下的,就是更友好,否则现代带图形界面的操作系统不可能几乎垄断个人电脑市场了,CLI 终究还是特定人群导向的
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     917 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 26ms UTC 22:16 PVG 06:16 LAX 15:16 JFK 18:16
    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