Git 和 GitHub:(十五)合并多次提交
上一篇下一篇rebase 到某个有新提交的远程仓库的分支目 录合并多次提交1法一使用 git reset --soft适合合并最新的多次提交2法二使用交互式 rebase通用合并多次提交要合并的多次提交此前有没有 push 都可以合并1法一使用 git reset --soft适合合并最新的多次提交原理利用git reset --soft回退分支指针同时保留所有改动在暂存区然后整体重新提交并默认使用最近一次提交的说明信息。操作步骤以合并最近 3 次提交为例确保工作区干净没有未暂存或未提交的修改建议先打一个备份分支gitbranch backup/my-branch# 可选但强烈推荐软回退到第 1 个提交之前保留全部改动gitreset--softHEAD~2HEAD~2因为总共 3 次提交回退 2 次后HEAD 指向最早那次提交的父节点。此时暂存区包含了这 3 次提交的全部改动工作区不变。复用最近一次提交回退前的 HEAD的提交信息生成新提交gitcommit-cORIG_HEADORIG_HEAD是git reset自动记录的“上一个 HEAD 位置”恰好指向你最近的那次提交。-c会打开编辑器并填入那次提交的信息你可以直接保存或进行微调和git commit的编辑页面一样。可选若不想做任何修改直接完全复用提交信息gitcommit-CORIG_HEAD# 大写 -C不打开编辑器确认结果gitlog--oneline此时历史中只剩下一个提交其提交信息为之前最近那次的信息。提交如果之前已经推送过这些提交那本地历史已变需要强制推送至远程如 GitLab/GitHubgitpush --force-with-lease如果从未推送过则直接普通推送gitpush通用化技巧合并最近 N 次提交将HEAD~2替换为HEAD~N-1。例如合并最近 5 次使用git reset --soft HEAD~4。如果想自定义提交信息可以不用-c ORIG_HEAD直接用git commit -m 新信息。注意事项软回退会把所有未提交的改动也带入暂存区操作前请确认工作区状态。如果回退的提交中包含了合并提交merge commitORIG_HEAD依然指向原来的 HEAD但复用其信息时需注意合并信息的格式。2法二使用交互式 rebase通用以合并最近三次提交为例所需指令如下# 查看提交记录精简版gitlog--oneline-3gitrebase-iHEAD~3# 修改提交历史# 若要合并的提交此前没有被推送则普通推送即可gitpush-uorigin 远程仓库分支名# 如果已经推送则此次须强制推送# git push --force-with-lease 远程仓库分支名# 再次查看提交记录验证gitlog--oneline-3执行git rebase -i HEAD~3然后修改提交历史的具体流程如下从上往下是旧→新和 git log 相反然后把后两个提交的pick改成squash或s按i开始编辑和 git commit 一样按 ESC键入 :wq 退出编辑后Git 会弹出第二个编辑器让你编辑合并后的提交信息注意如果需要合并的提交之前已经 git push 到远程仓库了那么合并之后要使用强制推送如果之前没有推送那么普通推送即可。如果最近提交了 6 笔想合并前 4 次提交那么就git rebase -i HEAD~6然后将第 2/3/4 笔提交前的pick改成squash即可 …… 以此类推。