GIT:将本地分支的多次提交合并为一个commit到远程仓库
应用场景
当一个功能模块比较庞大时,本地工作区在开发中可能进行了多次 commit / merge 操作,这时本地版本库的工作树是混乱不堪的。
如果将混乱的工作树维持原状提交至远程分支,当我们只需要提前发布该部分的代码时,就要在 master 远程分支中不断地 pick + rebase 操作,产生不小的额外工作量,还有可能在 rebase 中丢失代码。
于是我们在开发完一个完整的模块后,应该将本地版本库中存在多次 commit 的工作树合并为一次 commit,再提交至远程仓库。
合并工作树中的commit
假设当前开发完成的功能模块有3次commit提交,我们需要将这个完整的模块推送至远程仓库,首先需要将这 3 次 commit 进行合并操作,(2024回看当时也真是提前实名制上网了笑死)。
取这 3 次 commit 的上一个 commit ID 执行 rebase 操作
进入操作面板,可见 Rebase 排序是由倒序排列的,我们可以用 squash (缩写 s ) 将每次 commit 合并至前一个 commit
键入i,将需要合并的 commit 前的 pick 操作 改为 squash
squash 做的事就是把每次 commit 合并到更早的一次 commit,因此最早的分支应该是 pick 操作,因为在这次 Rebase 中它是最早的一次 commit
如果是 squash 将会报错,如下:
修改后键入 :wq 保存退出,假若报错:
用自己习惯的方式解决此次本地冲突,解决所有冲突之后git status查看:
按提示git rebase --continue:
如果rebase操作没有代码冲突保存退出后直接进入日志面板:
仍然是键入 i 进入编辑模式,将三次 commit 的工作树日志合并:
编辑完成后键入 :wq 保存退出回到主面板:
使用 git log 查看是否合并成功:
可以看到 rebase 操作后的 3 次 commit 已经合并为一次 commit,并更换了 commit ID
这时就可以 push 到远程仓库了,假设之前的三次 commit 已经有进行过 push 操作,那么此次 push 会被检测到本地工作树与远程仓库的工作树相异而报错,
此时可以使用 --force 将本地版本库强制覆盖至远程仓库:(公共分支千万不要这样做,除非开发团队仅有一人)