我在我的项目中添加了一些功能,需要4个git提交,现在业务部门要求不再需要这些功能(超过一个月后)。所以我需要从我的repo中删除那些特定的git commit(s),之后现在还有27次提交。
答案 0 :(得分:6)
有四种方法:
清理方式,恢复但保留日志恢复:
git revert --strategy resolve <commit>
苛刻的方式,完全删除最后一次提交:
git reset --soft "HEAD^"
Rebase(显示最近5次提交的日志并删除您不想要的行,或重新排序,或者将多个提交压缩成一个,或者做任何你想做的事情,这是一个非常多才多艺工具):
git rebase -i HEAD~5
如果犯了错误:
git rebase --abort
快速rebase:仅使用其ID删除特定提交:
git rebase --onto commit-id^ commit-id
替代方案:您也可以尝试:
git cherry-pick commit-id
另一种选择:
git revert --no-commit
作为最后的手段,如果您需要完全自由编辑历史记录(例如,因为git不允许您编辑您想要的内容),您可以使用此very fast开源代码申请:reposurgeon。
注意:当然,所有这些更改都是在本地完成的,您应该git push
之后将更改应用到远程。如果您的repo不想删除提交(&#34;不允许快进&#34;,当您想删除已经推送的提交时会发生这种情况),您可以使用{{1}强制推动变革。
注意2:如果在分支上工作并且你需要强制推送,你绝对应该避免使用git push -f
,因为这可能会覆盖其他分支(如果你已经对其进行了更改,即使你当前的结账在另一个分支上) )。当您强制推送时,始终指定远程分支:git push --force
。
答案 1 :(得分:2)
因为您正在处理已发布的分支(可能是由您以外的人使用),我建议您使用git revert
恢复这两个提交。从问题分支类型:
git log
找到两个提交的SHA-1哈希值。然后使用以下命令恢复它们:
git revert abcd1234..foobar12
其中abcd1234
是两次提交中第一次(最早)的哈希值,foobar12
是两次提交中最新的一次。
使用git revert
将添加提交,有效地撤消分支中隐藏的两个提交。这种方法的替代方法是使用rebase或filter分支。但这两种方法都涉及重写分支的历史。这可能会让使用你的分支的其他人感到头痛,因为他们将无法再拉或推。