在项目维护的过程中,面对同类型功能的更新,最新时间线上的提交描述与历史记录中的描述存在细微差异。为了确保代码历史记录便于回溯和审查,我们就要将这些描述进行统一。好在,Git 提供了修改历史提交的方式,这使我们能够更好的维护出一个更优雅的提交历史。
前言
git rebase 是 Git 提供的命令之一,它不会创建新的提交,而是会修改现有的提交。通常用来修复提交消息、合并多个提交或者修复错误。
预修改确认
首先,我们找到需要退回的提交历史,然后复制其提交 ID,该值是通过 SHA-1 哈希算法生成的 40 位的十六进制字符
然后我们在终端中执行 git rebase -i 命令,将提交历史位置定位到该提交前。
git rebase -i cd1475d
当执行完成后,我们就进入了 rebase(变基)操作,此时终端会倒序显示目标提交到最新提交的所有提交历史。这时,如果我们直接更改提交信息是没有效果的,这个步骤主要为了确定那些提交历史需要更改。
我们点击i
,进入 vi/vim 编辑模式,找到所有需要更改的记录,把提交历史前面的 pick
更改为 edit
。最后点击 Esc
,切换到命令模式,输入 :wq
回车执行保存修改。
此时,终端提示以下信息,这代表 Git 进入了修改状态。在这个过程中,如果没有退出,也无法执行提交新的 commit。
依次修改提交历史
然后我们执行 git commit --amend
对当前提交历史的信息进行修改
此时我们就进入了目标历史提交信息的修改界面,我们点击i
键进入修改模式。当我们修改完成时,点击 Esc
,切换到命令模式,输入 :wq
回车保存修改。
当执行完成时,会显示更改了一条提交历史,这说明当前提交历史已经修改完成了
然后,我们需要通过执行 git rebase --continue
命令,进入到下一个提交历史
根据上面的操作,反复修改和执行命令,当终端显示没有更多的提交历史时,我们就完成了所有指定所有修改
推送所有修改
最后,由于更改了 Git 历史记录,所以通常的 git push
不会成功,这需要强制推送。我们需要通过 git push -f
推送本地历史记录到远程分支,将其覆盖。
注
如果在多人开发下,请慎用 git push -f
,因为这可能会改变远程分支提交的历史顺序。
此时,Git 的历史提交信息就修改完成了。此外,如果在修改过程退出,可以使用 git rebase --absort
直接中断结束修改,丢弃所有修改。
结语
因为修改过很多次远程分支的提交信息,所以我将这个过程记录下来,方便后续查阅。