如何将 git 存储库回滚到特定提交?
Posted
技术标签:
【中文标题】如何将 git 存储库回滚到特定提交?【英文标题】:How can I rollback a git repository to a specific commit? 【发布时间】:2011-05-21 07:43:46 【问题描述】:我的仓库现在有 100 个提交。我需要回滚存储库以提交 80,并删除所有后续的。
为什么?
这个 repo 应该是用于从其他用户合并。由于过度编辑,我提交了一堆合并。那是由于我的远程分支的标签错误,其中 3 个开发人员被标记为彼此。我需要重置到那个点,然后向前拉。
我想变基,例如:How can I remove a commit on GitHub?
然而,git 希望我做很多冲突管理。有没有更简单的方法?
【问题讨论】:
【参考方案1】:git reset --hard <old-commit-id>
git push -f <remote-name> <branch-name>
注意:正如下面的 cmets 所写,在协作环境中使用它是危险的:您正在重写历史
【讨论】:
人,请git push -f origin branch
。我只是度过了一段糟糕的时光,因为我错过了。
当心这个!您将在本地丢失所有提交,如果您推送将无法返回
这不是真的,你可以使用 git reflog 获取旧的提交
您可能需要使用git push origin HEAD --force
而不是git push -f origin branch
,因为这会给我一个error: src refspec branch does not match any.
错误
好的,谢谢你们。我设法做我想做的事。我首先在我想要回滚的提交之前创建了一个单独的分支。在本地克隆它。然后将您的建议应用到该副本上,这样,我就没有损害我的主分支...【参考方案2】:
另一种方式:
签出您要恢复的分支,然后将您的本地工作副本重置回您希望成为远程服务器上最新的提交(之后的一切都会再见)。为此,在 SourceTree 中,我右键单击并选择“将 BRANCHNAME 重置为此提交”。
然后导航到存储库的本地目录并运行以下命令:
git -c diff.mnemonicprefix=false -c core.quotepath=false push -v -f -- tags REPOSITORY_NAME BRANCHNAME:BRANCHNAME
这将删除本地存储库中当前提交之后的所有提交,但仅针对该分支。
【讨论】:
仅供参考 "REPOSITORY_NAME" 将类似于 https:/me@github.com/me/repo_name.git 如果你能分解该命令并解释它会更有帮助。【参考方案3】:要撤消最近的提交,我这样做:
第一:
git log
获取最新的 SHA id 以撤消。
git revert SHA
这将创建一个与您的提交完全相反的新提交。然后你可以推送这个新的提交以使你的应用程序恢复到以前的状态,你的 git 历史记录将相应地显示这些更改。
这对于立即重做您刚刚提交的内容很有用,我发现这对我来说更常见。
正如迈克所说,您也可以这样做:
git revert HEAD
【讨论】:
git revert HEAD
将还原最后一次提交,而无需查找哈希。
如果您根本不想删除提交,这是一个解决方案。但是,在这种情况下,所有垃圾提交仍然存在,并允许克隆器重置或签出它们。如果你想阻止这种情况,你必须强制推动。
注意:这些还原可以叠加,这意味着如果您不小心还原,您可以使用另一个还原来还原该还原。
公认的答案很棒,但我认为这个答案需要更多地看到,因为 RESET 和 REVERT 之间存在差异,如果他们在协作环境中工作,这对于人们来说可能非常重要。这是一个很好的解释:***.com/questions/8358035/…【参考方案4】:
当从 master 进行分支更新时,我注意到我有时会过度点击,并导致分支也合并到 master 中。找到了一种方法来撤消它。
如果您的最后一次提交是合并,则需要更多的爱:
git revert -m 1 头
【讨论】:
当我在远程 repo 上恢复提交时效果很好。【参考方案5】:在 github 中,最简单的方法是在 github UI 中的“分支”选项卡下删除远程分支。您必须确保删除以下设置以使分支可删除:
-
不是默认分支
没有公开投票请求。
分支不受保护。
现在在您的本地存储库中重新创建它以指向上一个提交点。并将其添加回远程仓库。
git checkout -b master 734c2b9b # replace with your commit point
然后将本地分支推送到远程
git push -u origin master
加回默认分支和分支保护等
【讨论】:
【参考方案6】:大多数建议都假设您需要以某种方式销毁最后 20 次提交,这就是为什么它意味着“重写历史”,但您不必这样做。
只需从提交 #80 创建一个新分支,然后继续处理该分支。其他 20 个提交将保留在旧的孤立分支上。
如果您绝对希望您的新分支具有相同的名称,请记住该分支基本上只是标签。只需将旧分支重命名为其他名称,然后在提交 #80 处使用您想要的名称创建新分支。
【讨论】:
我猜这也会有问题地与每个人感兴趣的分支历史的本地版本混淆。 如果需要这么大的回滚,那肯定大家的本地版本都需要再拉最新的(第一人准备的)。如果您想“回滚”,它会更安全。以上是关于如何将 git 存储库回滚到特定提交?的主要内容,如果未能解决你的问题,请参考以下文章