原理:采用一个新的分支使用 reset --hard 回退版本,回退之后使用 cherry-pick 将源分支 Commit 应用到修改分支,创建一个新的 Commit 取而代之
合并完成之后返回源分支 rebase 合并分支,源分支合并完成之后推送到远程,完成修改
知道了原理,现在我们来实际操作一下
远程分支现在有这样一个提交日志,我们想要删除 b6c6ee5
又想要保存修改的内容
b6c6ee5 (HEAD -> master) Merge branch 'master' xxx
9189e06 第三次提交
0d6ea9f (origin/master) update test.txt.
a6c479f update test.txt.
04e0fd8 第二次提交
ef901f6 第一次提交
我们新建一个修复分支用来进行修复这条不太好看的提交记录
git branch fix # 新建修复分支
git checkout fix # 切换到修复分支
git reset --hard 9189e06 # 回滚到第三次提交
HEAD 现在位于 9189e06 第三次提交
git cherry-pick 0d6ea9f # 将源分支应用到修复分支,可能需要解决冲突
解决一下冲突
解决完之后我们再次查看一下 git log
,可以发现 Merge branch xxx
的提交信息没有了,取而代之的是 f90b222
,同时我们以前的提交也是存在的,然后我们合并一下修复分支
git log
f90b222 (HEAD -> fix) update test.txt
9189e06 第三次提交
a6c479f update test.txt.
04e0fd8 第二次提交
ef901f6 第一次提交
git checkout master # 切换分支
git rebase fix # 合并分支
git rebase --skip
git push -f # 强制推送分支,因为我们落后远程分支的版本,所以需要强制推送
之后我们再查看远程分支,也没有了 Merge branch xxx
的提交信息
远程分支的提交记录是这样的,我们想要删除 460943d
这个合并提交
112c907 (HEAD -> master, origin/master) 第七次提交
befef8f 第六次提交
460943d Merge branch 'master' of xxxx
2393be2 第五次提交
e1d66e4 update test2.txt.
f6be66e add test2.txt.
部分操作和情况一是一样的,我们同样也是新建一个修复分支(fix),然后进行 git reset --hard
回滚之后 git cherry-pick
应用部分提交,下面是具体操作
git branch fix # 新建修复分支
git checkout fix # 切换修复分支
git reset --hard 2393be2 # 回滚到 Merge branch 提交的前一条 Commit
git cherry-pick 112c907 befef8f # 对 112c907-befef8f 区间的提交进行合并
git cherry-pick
之后可能需要解决部分冲突,这里就不做详细说明如何去解决冲突了, 合并完成后我们再次查看 git log
git log
78c5e94 (HEAD -> fix) 第七次提交
44ae33d 第六次提交
2393be2 第五次提交
f6be66e add test2.txt.
这里值得注意的是:原先的 Commit 已经被修改了!取而代之的是我们新的提交
这就是为什么我们能删除掉 Merge branch
的原因, 所以使用这个方法去删除提交记录,会修改远程提交的提交记录.
修复完毕后我们切换分支进行合并推送到远程
git checkout master
git rebase fix
git rebase --skip
git push -f
使用该方法清除提交记录信息会导致提交后的 Commit
发生改变,同时需要手动处理冲突.
博主作为一个 Git
小白,此方法只是自己摸索出来的一种办法,如果您有更好的建议欢迎讨论!
最后,希望能够帮助到你.