我有一个从master创建的分支.txt
。 feature-Test
分支包含以下文件夹结构:
feature-Test
我错误地删除了并且提交了一个push to。
现在我如何恢复以使我拥有相同的文件夹结构?
答案 0 :(得分:1)
您可以使用 <li><a data-async-load="xy.php"></a></li>` tag
恢复提交。这将创建一个新的提交,它会恢复您使用git revert <commit_id>
指定的提交的更改。
要获取<commit_hash>
,请执行<commit_id>
并找到进行更改的相关提交。
答案 1 :(得分:0)
有几种方法可以解决这个问题。通常,您可以尝试重写历史记录以完全撤消错误,或者您可以在历史记录的末尾添加“恢复”,以便历史记录将包括“删除某些文件的提交”,然后“提交放置”文件回“。
需要考虑的一件事是,在共享('推送')之后重写历史需要一些成本。如果您尝试遵循大多数其他答案的建议,当您尝试push
时,您将收到错误;这是git告诉你,你正在尝试重写历史记录,这可能会给其他用户带来问题。你仍然可以做到,但不应该轻易做出决定。为什么这么多人认为可以建议这样做,而不讨论它引起的问题,这是超出我的。
另一个考虑因素是包含文件删除的提交是否也包含您要保留的更改。
所以让我们开始简单:如果你想完全撤销提交中的所有更改,但是愿意将提交作为分支历史记录的一部分,那么你只需要做
git revert HEAD
这将创建一个新的提交,将内容恢复到最近提交之前的内容 - 因此删除的文件应该返回,假设在删除后没有提交任何新内容。您可以推送此提交,一切都将恢复原状,除了git log
将显示带有错误的提交以及以下提交以撤消它。
如果在删除后已经提交了其他工作,则可以对其进行调整。您只需要为revert
命令提供要撤消的提交的有效名称。这可以是提交ID,也可以是HEAD~2
之类的表达式(如果在撤消之后有2次提交),或者在某些情况下是reflog表达式......有很多种可能性。
如果你想保留一些提交的更改,你可以说
git revert -n HEAD
这是类似的,但它不是自动提交“撤消”更改,而是将它们放在索引和工作树中 - 换句话说,作为暂存但未提交的更改。然后,您可以对提交进行进一步编辑,例如使用git checkout HEAD -- path/to/a/file/with/changes/you/want/to/keep
。
在整个过程中,您可以使用git status
来确定要进行哪些更改,记住这一点,因为这是一个还原,您希望保留来自还原提交的任何更改是您想要的 not 在最终的status
中看到。
如果这样“向后”工作会让人感到困惑,或者只是更容易识别已删除文件的路径,那么您可以跳过恢复命令并手动执行“撤消”工作。对于每个删除的路径
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
可以更简单。
答案 2 :(得分:-1)
我建议你通过以下方式检查你犯了错误的提交:
git checkout hash
但是,如果你确定提交的是什么,你应该:
git reset --hard hash
然后,推动掌握。
答案 3 :(得分:-1)
使用
git reset ~HEAD
取消提交最后一次提交
再次添加文件夹并使用git commit -am "<your_message>"
进行新的提交
然后再用git push origin master
我希望你的问题可以解决它。尝试使用它。