合并 git 中已推送的多个旧提交?

Merge multiple old commits in git which have already been pushed?

我有一堆我已经推送的旧提交。这些是小的更改 'e.g. typos',我想将它们合并在一起,这样我就没有 100 多个类似的提交。

例如这个:

7af8cee5715e266bf249891cf66f832cf8bb6606 typo 53104d19d1e2eba92baf36b8384100c461e417c1 typo 9e5afd2afc5d6051f568ce3a441eebf087c9ea46 typo fb8be7c9c54ae2d9ee3ed15971de49104729e4d6 ok 48828aaf959ee76d77a74dc35b8455542d0dbb8b fixed links 6387e73bd692024acbb67c1a843348dd6bd01bb8 fixed link baff3fc602faab37fbd0bf7df9c61ff367121985 fixed htaccess issue 2b3e66c19af49030a1da16f9fb7955c4d0f9aa3e fixed htaccess issue 5224690d2a44ec0c4872bedb3b54fb55af75530a fixed iplogging issue

注意:这些不是直接在最后一次提交之后,而是几个月前的。

您唯一的选择是对提交执行交互式变基并将重写的提交强制推送到服务器端存储库。如果此后的提交包含合并提交,我建议您保持历史原样。

  1. 首先,找到您要更改的第一个提交的 SHA,例如522469.
  2. 检查自以下时间以来是否合并了其他分支:git log --oneline --merges 522469~1。如果这会生成输出,请不要 运行 交互式变基。
  3. 开始交互式变基:git rebase --interactive 522469~1
  4. git 将向您显示从 522469 开始的提交列表,您可以重新排序。对于要合并的提交,将 pick 命令(第一列)更改为 squashfixup
  5. 重新排序并 squash/fixup 随心所欲,保存文件并关闭编辑器。
  6. 交互式变基完成后,检查您的构建。
  7. 作为最后一步,将重写的历史强制推送到远程存储库:git push --force origin HEAD

一些注意事项:

  • 如果有合并提交,交互式变基将删除它们。所以请不要 git rebase --interactive 如果 #2 生成了输出。
  • 交互式变基只影响当前分支的提交(即 HEAD 可达)。任何基于编辑器 window (git branch --contains 522469) 中任何提交的分支都需要基于其重写的对应分支。因此,涉及的工作可能比上面显示的更多。检查 git rebase --onto.
  • 将来,当您发现需要 change/fix 最近的提交时,使用 git commit --amend 重写 HEAD 提交,而不是创建新的提交。另一种选择是 git rebase --interactive 提交较少(例如,不是几个月前,而是 2 小时前,HEAD~10),这可能会减少冲突的可能性。