V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
yagamil
V2EX  ›  程序员

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

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

    请教各位 V 老师

    用网上的教程:

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

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

    24 条回复    2023-09-14 10:55:56 +08:00
    z1829909
        1
    z1829909  
       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   ·   实用小工具   ·   1188 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 34ms · UTC 18:23 · PVG 02:23 · LAX 10:23 · JFK 13:23
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.