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

2025 年 8 月 15 日
 tiRolin

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

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

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

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

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

5250 次点击
所在节点    git
35 条回复
tinypig
2025 年 8 月 15 日
我猜你需要的是 git-rebase
https://git-scm.com/docs/git-rebase
MonkeyJon
2025 年 8 月 15 日
全选右键,create patch
切换到主分支
apply patch
commit
ooo4
2025 年 8 月 15 日
github 的 squash merge ?
msg7086
2025 年 8 月 15 日
Squash merge
hwdq0012
2025 年 8 月 15 日
git rebase -i 想合并到的分支~1 , 会弹出一个可编辑的文档,在上面修改 pick 为 f 表示合并到父提交, 或 s 表示 合并到父提交,并修改父提交的 commit message
clino
2025 年 8 月 15 日
evan1
2025 年 8 月 15 日
我一般不处理,直接用 idea 过滤下就行了。

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

或者新开一个分支,idea 选中你原分支要合入的所有 commit ,右边会出现这些 commit 的修改文件列表,全选把变更拿到新分支上提一个 commit
dizheyoulan
2025 年 8 月 15 日
合并成一个的话,直接
git reset --soft 2ebc134 # 软重置到第一个提交
git commit --amend -m "新的提交信息" # 修改第一个提交
momocraft
2025 年 8 月 15 日
git rebase -i

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

然后使用 %s#pick#f#g 将里面的 pick 全部替换成 fixup 。再 1G 跳到第一行,将第一行的 f 改成 p 。即可。当然,你也可以选择保留 commit message 。将上述的 f 改为 s 即可(好像就是 s ?)
cnhongwei
2025 年 8 月 15 日
如果是使用 idea ,不要在原分支上压缩,你在分支上开发完了,从这个分支上创建了个新分支,不要 push ,再压缩你的所有提交,再 push ,再 merge 或 rebase 到主分支。
FlashEcho
2025 年 8 月 15 日
你 squash 和 commit --amend 之后是不是直接 push 了,所以出现两个一样的 commit ,这种情况应该 force push ,不然没法覆盖掉前一个
jjwjiang
2025 年 8 月 15 日
squash 之后你自己的当前分支是废掉的了,不能继续用,因为 squash 合并的这个 commit 在你本地是不存在的,你本地是一堆合并前的 commit ,所以如果你在你这个分支继续修改提交就会出现很诡异的记录。squash 之后要新建分支,这点要注意。
user1284
2025 年 8 月 15 日
你是不是把已经提交的也压缩了, 我自己的使用经验是压缩只用于本地多个 commit 只做一件事的时候先压缩再推送, 然后再合并
peakmuma
2025 年 8 月 15 日
如果这个分支只有你自己的代码那么就本地先进行 squash merge ,
如果这个分支之前 push 到远端过,那么新 push 需要强制推送 git push -f

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://study.congcong.us/t/1152591

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX