删除两次提交之间的git提交

时间:2016-11-13 06:35:51

标签: git github

我在我的项目中添加了一些功能,需要4个git提交,现在业务部门要求不再需要这些功能(超过一个月后)。所以我需要从我的repo中删除那些特定的git commit(s),之后现在还有27次提交。

2 个答案:

答案 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分支。但这两种方法都涉及重写分支的历史。这可能会让使用你的分支的其他人感到头痛,因为他们将无法再拉或推。