删除 git 中提交的更改

delete committed changes in git

我不小心将更改推送到我现在想删除的 Dev 分支。不是还原,而是完全删除它们。 由于对 Dev 分支设置了约束,我不能直接提交到该分支,而是通过拉取请求。 这些是我的步骤: 我基于 Dev 创建了一个新分支,名为 Dev_Reset。 那么:

git reset 4db52f3  --hard
HEAD is now at 4db52f3 last_changes_to_keep

git push origin -f

然后 Dev_Reset 分支被推送到远程仓库。但是,当我创建一个拉取请求时,没有任何差异可以合并,因为它说 Dev_ResetDev 之间没有差异。如果我查看 Visual Studio 中分支的历史记录,我会发现 HEADS(本地 DevDev_Reset)都在提交 4db52f3,但是对于出于某种原因我无法将其推送到我的主要 Dev 分支。

此外,在历史概览中,我仍然看到我想使用 git reset xxx --hard 命令删除的所有提交,这些提交列在 HEADS 上方。没有其他分支指向我要删除的任何提交。

我知道 git reset --hard 的危险,但目前我是唯一一个在这个分支上工作的人。 我怎样才能让所有这些提交消失并将我的主要 Dev 分支重置为正确的提交?

谢谢

编辑(2020 年 3 月 9 日) 正如 Igal S 和 LeGEC 在下面建议的那样,我必须调整 Dev 分支的设置,然后才能在此处应用我的更改。注意到其他同事对获取分支的担忧,我的团队已被告知。目前,最近没有人拉过相应的分支。感谢您的帮助!

从远程分支删除这些更改的唯一方法是像您一样执行 git reset --hard 然后强制将它们推送到远程分支。

假设您的政策允许这样做,并且您有权这样做。您的遥控器使用哪个系统 git?

拉取请求仅用于添加 从分支到另一个分支的提交。我不熟悉任何允许使用拉取请求删除提交(即重写历史)的系统

"erasing" 错误的提交需要重写历史,你不能通过拉取请求来做到这一点。


如果确实必须删除这些提交:您必须要求具有管理员权限的人暂时禁用 Dev 分支上的策略,强制推送,然后重新启用该策略。
这也意味着通知其他人(例如:给您的同事发邮件)并确保每个人在手术后修复他的本地历史记录。

否则:
您只能通过新的提交和新的拉取请求来恢复修改。


另请注意:由于提交已发布,您必须假设有人已获取它们。
例如,如果错误是将私钥推送到存储库,您可以清除中央存储库上的历史记录;但是 git 单独不会删除有权访问回购的人的硬盘驱动器中的数据,并且取决于共享的范围(例如:如果中央回购是共享 github 回购),实际的解决方法是创建新密钥并使之前的密钥无效。