如何将推送恢复为git

时间:2017-11-21 10:15:57

标签: git

我有一个从master创建的分支.txtfeature-Test分支包含以下文件夹结构:

feature-Test我错误地删除了并且提交了一个push to。

现在我如何恢复以使我拥有相同的文件夹结构?

4 个答案:

答案 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

推送它

我希望你的问题可以解决它。尝试使用它。