如何在推送提交后删除文件?
如何在推送提交后删除文件?
问题的出现原因:在使用git push命令将提交推送到远程仓库后,发现需要删除其中一个文件。但是,git push命令并不提供直接删除文件的功能。
解决方法:可以通过以下方式解决该问题:
1. 使用git push -f origin HEAD^:master
命令来撤销刚刚的推送操作。这个命令会移动分支指针,将其指向上一个提交,从而达到撤销的效果。需要注意的是,这只是移动了分支指针,而远程仓库中的提交仍然存在。
2. 如果使用的是GitHub应用程序,可以在“历史记录”页面打开需要撤销的提交,并点击“撤销提交”按钮。或者可以选择之前的提交并点击“还原到此提交”按钮。这两个操作都能够撤销指定提交以及之后的所有更改。
3. 可以使用git reset --hard HEAD~1
命令来删除本地仓库中的最后一个提交。这个命令会重置HEAD指针并删除相关的提交,需要注意的是,HEAD后面的^符号可以替换为~符号,例如HEAD~3代表删除最后三个提交。
4. 如果出现“Everything up-to-date”的错误提示,可能是本地仓库不是最新的,可以尝试使用git push -f origin HEAD\^:master
或git push -f origin HEAD~:master
命令来强制推送指定的提交。
需要注意的是,这些解决方法并不适用于所有情况,如果本地仓库和远程仓库存在其他差异,可能会导致更多的提交丢失。因此,在使用这些命令之前,建议先备份重要的提交或咨询相关的版本控制工具专家。
如何在提交后删除文件?
首先,在本地存储库上删除提交。您可以使用git rebase -i
来做到这一点。例如,如果这是您的最后一次提交,您可以使用git rebase -i HEAD~2
并删除弹出的编辑窗口中的第二行。
然后,通过使用git push origin +branchName --force
强制推送到GitHub。
请参阅Git Magic第5章:历史的教训 - 以及其他内容 获取更多信息(例如,如果您想删除旧的提交)。
哦,并且如果您的工作树是脏的,您必须先执行git stash
,然后执行git stash apply
。
不需要对本地树进行任何修改来满足用户的请求。
请注意,删除本地提交将完全损坏它,而不仅仅是“取消提交”。我认为无法恢复它。
请注意,这仍然会在reflog中保留提交。如果您在其中有敏感数据,可能必须完全删除存储库。
我很困惑。为什么不能使用git reset --soft HEAD^
取消提交,然后执行git push origin +master
?为什么我们在这种情况下使用git rebase -i HEAD^^
?
因为我3.5年前不熟悉reset --soft
。
完成。我刚刚使用了git reset --soft
方法,效果很好。git rebase
是一种吓人的黑魔法。
大家要小心。请参阅下面的subutux的评论。即使在强制推送到GitHub之后,GH仍然缓存您的提交。来自help.github.com/articles/remove-sensitive-data:"危险:一旦提交已被推送,您应该将数据视为已被泄露。如果您提交了密码,请更改!如果您提交了密钥,请生成新密钥。"
这真的是删除提交还是恢复更改?
对不起,"+
哦,它意味着“强制推送”,对吗?
您的“删除第二行”评论已过时或需要澄清。
嗨,我尝试了这个方法,但它告诉我“Everything up-to-date”,并且不起作用。有什么想法吗?
谢谢,它对我有用,但是“删除第二行”对我来说似乎不正确。我有A-B-C,我最终删除了B-C而不仅仅是C :(。
为什么您在branchname
之前放置+
?
这是关于“git reset --soft HEAD^”的一个好参考:stackoverflow.com/questions/24568936/…
另外,“HEAD^”等同于“HEAD~1”。参见:salferrarello.com/git-head-tilde-vs-head-caret
所以我按照您的解决方案执行,结果被覆盖并推送到了错误的仓库。所以我丢失了我想要的提交?有没有办法再次检索它?
非常感谢!如果您的远程分支受到强制推送的保护,请更改其设置!