假设您有以下情况:
* 1bd2200 (HEAD, master) another commit
* d258546 bad commit
* 0f1efa9 3rd commit
* bd8aa13 2nd commit
* 34c4f95 1st commit
如果您想要删除d258546(即“坏提交”),您可以尝试交互式变基:git rebase -i 34c4f95
,然后您的默认编辑器将弹出类似于以下内容:
pick bd8aa13 2nd commit
pick 0f1efa9 3rd commit
pick d258546 bad commit
pick 1bd2200 another commit
只需删除包含您想要剥离的提交的行,并保存+退出编辑器:
pick bd8aa13 2nd commit
pick 0f1efa9 3rd commit
pick 1bd2200 another commit
...
Git将从您的历史记录中删除此提交,留下类似以下内容(请注意,从已删除的提交后代开始哈希值已发生更改):
* 34fa994 (HEAD, master) another commit
* 0f1efa9 3rd commit
* bd8aa13 2nd commit
* 34c4f95 1st commit
现在,由于我假设您已经将错误提交推送到gitlab,因此您需要重新将图形推送到存储库(但使用-f
选项防止由于不可快速转发的历史记录而被拒绝,即git push -f <your remote> <your branch>
)。
请格外小心,并确保没有同事已经在他们的分支中使用包含“坏提交”的历史记录。
备选方案:
与其重写历史记录,不如创建一个新提交,以抵消您的错误提交引入的更改,只需键入git revert <your bad commit hash>
。这个选项可能不是很干净,但是更加安全(如果您不完全了解交互式变基的操作)。
git push origin master --force
计数对象:5,完成。
使用最多4个线程的Delta压缩。
正在压缩对象:100%(5/5),完成。
写入对象:100%(5/5),1.02 KiB | 131.00 KiB/s,完成。
总共5个(delta 0),重用0个(delta 0)
远程:GitLab:您不被允许向此项目的受保护分支强制推送代码。
因此,GitLab仍然没有解决方案。 - Roman Shishkin