最近遇到了一个让人头疼的问题,就是新建分支开发,然后新分支上提交了多次代码然后又合并回主分支。那么怎么把这些代码无痛合并回去呢?
有的大佬可能说,直接merge不就行了,巧了!我们这边在新分支开发的同时主分支有可能也在开发别的版本,所以无法直接merge。因为有可能丢失部分功能代码,然后一次一次Cherry-pick大家都看得到,不仅影响大家视觉体验又很low,所以只能把多次代码合并为一次提交。但我又没有这个经验(之前没有这种要求所以无脑merge就可)。所以今天第一次搞完分享一下,和大家一起涨涨经验学习一下:
在 Git 中,你可以使用 git rebase
命令的交互式模式来合并多个提交。以下是将13个提交合并成一个提交的步骤:
打开终端并切换到你的 Git 仓库目录。
运行以下命令,进入交互式模式,HEAD~13 表示从当前 HEAD 开始往前数13个提交:
git rebase -i HEAD~13
这将打开一个文本编辑器,其中列出了最近的13个提交。每个提交前面都有一个操作符(默认为 pick)。
将你想要合并的12个提交的操作符从 pick 改为 s 或 squash。这意味着这些提交将被合并到第一个提交中。
关于怎么编辑:
这将打开一个文本编辑器,其中列出了最近的13个提交。每个提交前面都有一个操作符(默认为 pick)。提交列表看起来可能像这样:
pick 1234567 Commit message 1
pick 2345678 Commit message 2
pick 3456789 Commit message 3
直接鼠标聚焦到pick那里把要合并的改为s即可,后面的提交信息如果想改的话也可以直接改。
保存并关闭文本编辑器。
关于怎么保存并关闭文本编辑器:
改好后,直接按esc按钮,退出编辑文本编辑器后输入:wq
即可开始变基
Git 将开始执行重基操作,并在合并过程中可能会要求你解决冲突。如果有冲突,按照提示进行操作。
当所有提交都被合并后,Git 将打开一个新的文本编辑器,用于编辑合并后的提交消息。输入你想要的提交消息,然后保存并关闭编辑器。
最后,使用以下命令将更改推送到远程仓库:
git push --force origin
注意:使用 --force 可能会影响其他人对该分支的工作,因为它会改变远程仓库的历史记录。
请确保在进行此操作之前,你已经备份了所有重要的数据,并且已经与其他团队成员沟通了你的计划。
注意:
我在变基过程中遇到了两个坑!!!!
1.报错:
squash cd7c8a4 feat: 去除混淆代码(文>件系统集群需求误提)
No commands remaining.
You are currently rebasing branch 'name' on 'cd7c8a4'
这个输出是从 Git 的交互式重基(rebase)过程中产生的。它表明你已经完成了对提交 cd7c8a4 的处理,并且没有更多的命令需要执行。
在这个特定示例中,squash 命令被用来合并提交 cd7c8a4(标题为 “feat: 去除混淆代码(文档系统集群需求误提)”)与上一个提交。这样做的结果是将这两个提交合并成一个单独的提交,保留了更改但只显示了一个提交记录。
最后一行 “# No commands remaining.” 表示在当前的交互式重基会话中没有更多的操作需要执行。 “# You are currently rebasing branch ‘name’ on ‘7cfa41f’” 提供了当前正在重基的分支和基准提交的信息。
如果你满意当前的结果,可以保存并关闭文本编辑器(通常是 Vim 或 Nano),然后 Git 将继续执行重基过程并应用你所做的更改。
我直接保存并编辑了,就继续正常执行了(不代表所有情况,具体需求具体分析)
2.变基完成后应该作什么呢?
在完成重基(rebase)并合并了13个提交之后,你需要同步你的本地仓库与远程仓库。由于你已经对历史进行了修改,所以不能使用普通的 git push 命令。相反,你需要使用 git push 命令的 --force 选项来覆盖远程仓库的历史。
以下是同步更改的步骤:
获取最新的远程仓库状态:在开始推送更改之前,确保你有远程仓库的最新状态。使用以下命令来获取远程仓库的更新:
git fetch origin
使用 --force 选项推送更改:由于你已经更改了历史,因此需要使用 --force 选项来强制推送更改。请注意,这可能会覆盖其他人在同一分支上所做的更改。使用以下命令来推送更改到远程仓库的 name
分支:
git push --force origin name
通知团队成员:如果你在共享的分支上工作,应该通知你的团队成员你已经更改了历史,以便他们可以更新他们的本地仓库。
检查远程仓库:推送完成后,检查远程仓库以确保更改已经成功应用。
请记住,在共享的分支上使用 --force 推送可能会引起一些问题,特别是如果其他人也在同一分支上工作。因此,在执行此操作之前,请确保你已经与团队成员沟通并获得了必要的批准。
最后一步git log看操作成功了没,大功告成!