@
SimonOne 本质就是这样的,但 squash 还是 edit 需要你去做判断
大概是从这个回答得到的答案
https://stackoverflow.com/questions/307828/how-do-you-fix-a-bad-merge-and-replay-your-good-commits-onto-a-fixed-merge#answer-23188613从中就可以看出 reset 并不是一个好办法,因为你需要 hard reset + rebase 。而上面的 reset 回答全部没有提到这点,说明他们连 hard reset 和 reset 区别是什么都搞不清楚,也不知到后面的 rebase 要经历怎样的苦难
我的答案大概是 Solution 4 的简化版,其中使用了 Interactive Rebase
首先,你需要从要移除的提交开始执行 interactive rebase
`git rebase -i <要移除的前一个提交>~`
当然也可以指定结束的提交,注意结束的那个提交不会被删除
`git rebase -i <要移除的提交前一个提交开始> <要移除的提交结束>`
就可以看到你的提交了,直接把不想要的那几行前面的 pick -> squash 了(默认的操作编辑器是 vim ,感受一下命令行最叼编辑器吧),但你很容易删错,因为你此时看不到到底那几个提交记录了你哪几个文件,更改提交则使用 pick -> edit
接下来保存退出(什么你连保存退出 vim 都不会那还是趁早放弃吧——)
再执行`git commit --amend`保存这次修改,最后`git rebase --continue`就完成了这次修改,再 force push 到远端就抹除了,其他人已有你那个提交最简单就是重新 clone 一个,不然还要重新 merge
其实是很复杂的,你可以随时`git log`看看变化。
简化到 GUI 上就是打开提交历史,压扁成一个提交,没了就这么简单。
这是我这么多年和 git 搏斗总结的经验,如果还是有冥顽不化的人非要 reset 那只能祝你早日被 git 气到中风