[英]How do I revert a push to git
我有一个分支feature-Test
从master创建feature-Test
。 feature-Test
分支包含以下文件夹结构:
Test/methods
,我错误地删除了该Test/methods
,并将其推送提交给master。
现在如何恢复原样,使我拥有相同的文件夹结构?
您可以使用git revert <commit_id>
还原提交。 这将创建一个新的提交,该提交将还原您使用<commit_hash>
指定的提交的更改。
为了获得<commit_id>
,执行git reflog
并找到您进行更改的相关提交。
有两种方法可以解决此问题。 通常,您可以尝试重写历史记录以完全消除错误,也可以在历史记录的末尾添加“还原”,以便历史记录包括“提交删除某些文件”,然后“提交放置”。文件退回”。
要考虑的一件事是,在共享(“推送”)历史后重写历史会产生一些成本。 如果您尝试遵循大多数其他答案的建议,那么当您尝试进行push
时会遇到错误; 这是git告诉您,您正在尝试重写历史记录,这可能会对其他用户造成问题。 您仍然可以做到,但不要轻易做出决定。 为什么这么多人认为建议这样做而不讨论所引起的问题,这超出了我的范围。
另一个要考虑的是,包含文件删除的提交是否还包含您要保留的更改。
让我们开始简单:如果您想完全撤消提交中的所有更改,但又愿意将提交保留为分支历史的一部分,那么您只需
git revert HEAD
这将创建一个新的提交,使内容恢复到最近一次提交之前的外观-因此,假定删除后未提交任何新内容,则应返回已删除的文件。 您可以推送此提交,一切都会恢复git log
,除了git log
将显示带有错误的提交,以及随后的提交以撤消它。
如果删除后已执行其他工作,则可以对其进行调整。 您只需为要撤消的提交给revert
命令一个有效名称即可。 这可能是一个提交ID,或类似的表达HEAD~2
(如果有2个提交后一个要撤消)或一些条件引用日志表达下...有很多可能性。
如果您想保留提交中的某些更改,可以说
git revert -n HEAD
这是相似的,但是不是自动提交“撤消”更改,而是将它们放入索引和工作树中-换句话说,是已分阶段但未提交的更改。 然后,您可以对提交进行进一步的编辑,例如使用git checkout HEAD -- path/to/a/file/with/changes/you/want/to/keep
。
在这个过程中,你可以使用git status
,以确定都在上演什么样的变化,记住,因为这是你想要从恢复提交保留任何变化的复归是要在决赛中没有看到一个status
。
如果像这样的“后退”操作令人困惑,或者如果更容易识别已删除文件的路径,则可以跳过revert命令并手动执行“撤消”工作。 对于每个删除的路径
git checkout HEAD^ -- path/to/deleted/file
如果需要提醒您删除了哪些文件,可以使用
git show --name-status HEAD
它将在以D
开头的行上显示每个已删除的路径。
现在,如果由于某种原因您觉得值得额外麻烦,则可以修改历史记录。 您可能会认为历史看起来“干净”而没有意外提交-但坦率地说,这种虚荣心使许多人付出了不必要的努力。 真正有理由在推动提交后删除提交的大多数原因(提交包含密码,提交包含大文件等)需要比我在此详细说明的过程更彻底的过程。 这只是“清理”历史外观的最低限度的过程,您会发现这仍然是一个痛苦的过程。
因此,如果您尝试类似
git reset --hard HEAD^
git push
git会拒绝推送,因为您的分支将以非快进方式移动。 您可以使用
git push -f
使用push -f
是警告您将其他开发人员置于不利境地。 现在,他们的回购协议对分支的状况做出了错误的假设,因此他们将不得不恢复。 请参阅git rebase
文档中的“从上游rebase恢复”; 该指南适用于您推送的所有历史记录重写。
简而言之,其他开发人员将不得不强制更新其本地引用以反映强制推动。 (如果他们改为强行推销他们的工作,他们将撤消您的修复;因此,您确实需要与所有人进行协调。)根据错误的提交,他们已经完成的任何工作都必须重新设置基础。
如果其他开发人员很少,或者他们在该分支工作不多; 大家之间的交流很好; 然后就可以开始工作了。 但话又说回来,这样可以更简单地revert
。
我建议您通过以下方法检查犯错的提交:
git checkout hash
但是,如果您确定什么是提交,则应该:
git reset --hard hash
然后,推向高手。
使用git reset ~HEAD
git commit -am "<your_message>"
提交最后一次提交,再次添加文件夹并使用git commit -am "<your_message>"
进行新提交,然后再次使用git push origin master
推送它
希望您的问题能解决。 尝试使用它。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.