删除 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_Reset
和 Dev
之间没有差异。如果我查看 Visual Studio 中分支的历史记录,我会发现 HEADS
(本地 Dev
和 Dev_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 回购),实际的解决方法是创建新密钥并使之前的密钥无效。
我不小心将更改推送到我现在想删除的 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_Reset
和 Dev
之间没有差异。如果我查看 Visual Studio 中分支的历史记录,我会发现 HEADS
(本地 Dev
和 Dev_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 回购),实际的解决方法是创建新密钥并使之前的密钥无效。