我在我的项目中添加了一些功能,需要4个git提交,现在业务部门要求不再需要这些功能(超过一个月后).所以我需要从我的repo中删除那些特定的git commit(s),之后现在还有27次提交.
因为您正在处理一个已发布的分支,该分支可能正在被除您之外的其他人使用,所以我建议您使用恢复这两个提交git revert。从有问题的分支中输入:
git log
Run Code Online (Sandbox Code Playgroud)
并找到有问题的两个提交的 SHA-1 哈希值。然后使用以下命令恢复它们:
git revert abcd1234..foobar12
Run Code Online (Sandbox Code Playgroud)
其中abcd1234是两个提交中第一个(最旧的)的哈希值,foobar12是两个提交中较新的一个。
使用git revert将添加有效撤消隐藏在分支中的两个提交的提交。这种方法的替代方法是使用变基或过滤分支。但这两种方法都涉及重写分支的历史。这可能会给使用您分支的其他人带来麻烦,因为他们将无法再拉或推。
有四种方法:
干净的方式,恢复但保持在日志恢复:
git revert --strategy resolve <commit>
Run Code Online (Sandbox Code Playgroud)苛刻的方式,完全删除最后一次提交:
git reset --soft "HEAD^"
Run Code Online (Sandbox Code Playgroud)Rebase(显示最近5次提交的日志并删除你不想要的行,或重新排序,或者将多个提交压缩成一个,或者做任何你想做的事情,这是一个非常通用的工具):
git rebase -i HEAD~5
Run Code Online (Sandbox Code Playgroud)如果出现错误:
git rebase --abort
Run Code Online (Sandbox Code Playgroud)
快速rebase:使用其id仅删除特定提交:
git rebase --onto commit-id^ commit-id
Run Code Online (Sandbox Code Playgroud)替代方案:您也可以尝试:
git cherry-pick commit-id
Run Code Online (Sandbox Code Playgroud)另一种选择:
git revert --no-commit
Run Code Online (Sandbox Code Playgroud)作为最后的手段,如果你需要完全自由的历史编辑(例如,因为git不允许你编辑你想要的东西),你可以使用这个非常快速的开源应用程序:reposurgeon.
注意:当然,所有这些更改都是在本地完成的,git push之后您应该将更改应用到远程.如果您的repo不想删除提交("不允许快进",当您想删除已经推送的提交时会发生这种情况),您可以使用git push -f强制推送更改.
注意2:如果在分支上工作而你需要强制推送,你应该绝对避免,git push --force因为这可能会覆盖其他分支(如果你已经对它们进行了更改,即使你当前的结账在另一个分支上).强制推送时,首选指定远程分支:git push --force origin your_branch.