Git修改提交记录的顺序/删除某次提交记录

网上搜索了很多方法,不一而足,本博文提到的方法,是我认为最容易理解的:

每一次提交记录,都能生成对应的补丁(patch),先生成各个提交记录的补丁,然后硬回退版本(reset --hard),然后按照期望的提交顺序,顺次打补丁(am).

关于补丁之间的冲突,没有考虑(因为调整的是某个分支上的提交记录,理论上不会有冲突的地方),有冲突风险的,不在本文讨论范围之内.
关于补丁的生成和应用,参见博客:

https://www.cnblogs.com/ArsenalfanInECNU/p/8931377.html

  1. 如图所示,某次开发过程中,需要调整红框中两次提交记录到箭头所示位置
    Git修改提交记录的顺序/删除某次提交记录
  2. 生成补丁:git format-patch -n;此情景下,n的值为4;生成补丁情况,如下图所示(补丁的序号,是从最后一次提交记录倒序到1,即n…1)
    Git修改提交记录的顺序/删除某次提交记录
  3. 硬回退版本(reset --hard version-num),如图示,回退后,远程分支未受影响,本地的head已经变更.
    Git修改提交记录的顺序/删除某次提交记录
  4. 我们期望的提交记录顺序是:0003(smallFix),0004(版本号153),0001(…),0002(…),则按照这个补丁顺序依次打补丁即可,注意补丁和提交记录的对应关系.注:如果中途失败,执行git am --abort
    Git修改提交记录的顺序/删除某次提交记录
  5. 应用完最后一条补丁后效果如图示:
    Git修改提交记录的顺序/删除某次提交记录
    这时候,是强推到远程分支,还是删除远程分支后再重新push,看你的喽.
  6. 会用补丁调整提交顺序了,删除某次提交记录还在话下吗?删除某个补丁,让后git am *.patch,会按照path的序号,顺次应用所有补丁.保险起见,在生成补丁进行应用之前,将所有补丁拷贝出一份来再进行操作.