合并 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
注意:这些不是直接在最后一次提交之后,而是几个月前的。
您唯一的选择是对提交执行交互式变基并将重写的提交强制推送到服务器端存储库。如果此后的提交包含合并提交,我建议您保持历史原样。
- 首先,找到您要更改的第一个提交的 SHA,例如
522469
.
- 检查自以下时间以来是否合并了其他分支:
git log --oneline --merges 522469~1
。如果这会生成输出,请不要 运行 交互式变基。
- 开始交互式变基:
git rebase --interactive 522469~1
- git 将向您显示从
522469
开始的提交列表,您可以重新排序。对于要合并的提交,将 pick
命令(第一列)更改为 squash
或 fixup
。
- 重新排序并
squash/fixup
随心所欲,保存文件并关闭编辑器。
- 交互式变基完成后,检查您的构建。
- 作为最后一步,将重写的历史强制推送到远程存储库:
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
),这可能会减少冲突的可能性。
我有一堆我已经推送的旧提交。这些是小的更改 '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
注意:这些不是直接在最后一次提交之后,而是几个月前的。
您唯一的选择是对提交执行交互式变基并将重写的提交强制推送到服务器端存储库。如果此后的提交包含合并提交,我建议您保持历史原样。
- 首先,找到您要更改的第一个提交的 SHA,例如
522469
. - 检查自以下时间以来是否合并了其他分支:
git log --oneline --merges 522469~1
。如果这会生成输出,请不要 运行 交互式变基。 - 开始交互式变基:
git rebase --interactive 522469~1
- git 将向您显示从
522469
开始的提交列表,您可以重新排序。对于要合并的提交,将pick
命令(第一列)更改为squash
或fixup
。 - 重新排序并
squash/fixup
随心所欲,保存文件并关闭编辑器。 - 交互式变基完成后,检查您的构建。
- 作为最后一步,将重写的历史强制推送到远程存储库:
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
),这可能会减少冲突的可能性。