如何将github存储库回滚到特定提交?


431

我的github现在有100个提交。我需要回滚存储库以提交80,并删除所有后续存储库。

为什么?该回购应该用于其他用户的合并。由于过度的编辑,大量合并作为我提交的内容。那是由于我的远程分支贴错了标签,在那里3个开发人员被标记为彼此。我需要重置到该点,然后向前拉。

我想重新设置基准,如本例所示:如何在GitHub上删除提交?

但是,git希望我做很多冲突管理。有没有更简单的方法?

Answers:


882
git reset --hard <old-commit-id>
git push -f <remote-name> <branch-name>

注意:如下面的评论中所述,在协作环境中使用它很危险:您正在重写历史记录


43
人,做git push -f origin branch。我只是度过了一段糟糕的时光,因为我错过了。
Sumit M Asok 2014年

21
注意这一点!您将在本地丢失所有提交,并且如果您继续推送,将
Thomas Thomas

8
事实并非如此,您可以使用git reflog获得旧的提交
Jan Schaefer

27
您可能需要做git push origin HEAD --force而不是git push -f origin branch那样做,这给我一个error: src refspec branch does not match any.错误
sprocket12

1
是的,谢谢大家。我设法做到了自己想要的。我首先从要回滚的提交之前的分支创建了一个单独的分支。在本地克隆。然后将您的建议应用于该副本,这样,我就不会破坏我的主要分支……
Gauthier Boaglio 2015年

21

要撤消最近的提交,我可以这样做:

第一:

git log

获取最新的SHA ID来撤消。

git revert SHA

这将创建一个与提交完全相反的新提交。然后,您可以推送此新提交以将您的应用恢复到之前的状态,并且git历史记录将相应地显示这些更改。

这对于立即重做刚刚执行的操作非常有帮助,我发现这种情况在我看来更常见。

正如Mike提到的,您还可以执行以下操作:

git revert HEAD

8
git revert HEAD将还原上一次提交而不必查找哈希。
Mike Baranczak

如果您根本不想删除提交,则这是一个解决方案。但是,在这种情况下,所有垃圾提交仍将存在,并允许克隆程序对其进行重置或检出。如果要防止这种情况,则必须强制推动。
cst1992 '11

19

另一种方式:

签出要还原的分支,然后将本地工作副本重置回您要成为远程服务器上最新提交的提交(此操作之后的所有操作都会再见)。为此,我在SourceTree中,右键单击,然后选择“将BRANCHNAME重置为此提交”。

然后导航到存储库的本地目录并运行以下命令:

git -c diff.mnemonicprefix=false -c core.quotepath=false push -v -f -- tags REPOSITORY_NAME BRANCHNAME:BRANCHNAME 

这将删除本地存储库中当前提交之后的所有提交,但仅针对该分支。


1
仅供参考,“ REPOSITORY_NAME”将类似于https:/me@github.com/me/repo_name.git
蒂姆,

3
如果您分解该命令并对其进行说明,将会更有帮助。
cst1992 '11

3

大多数建议都假设您需要以某种方式销毁最后20次提交,这就是为什么它意味着“重写历史记录”的原因,但是您不必这样做。

只需从commit#80创建一个新分支,然后继续进行该分支。其他20个提交将保留在旧的孤立分支上。

如果您绝对希望新分支具有相同的名称,请记住该分支基本上只是标签。只需将旧分支重命名为其他名称,然后在提交#80处使用所需名称创建新分支。


我猜想这也会与每个人感兴趣的分支机构的本地版本产生问题。
ragerdl

2

从master进行分支更新时,我注意到有时会单击鼠标,并使分支也合并到master中。找到了一种解决方法。

如果您的最后一次提交是合并,则需要多一点爱:

git revert -m 1头


1

在github中,简单的方法是在github UI中的branchs选项卡下删除远程分支。您必须确保删除以下设置以使分支可删除:

  1. 不是默认分支
  2. 没有公开投票要求。
  3. 分支不受保护。

现在,在本地存储库中重新创建它以指向上一个提交点。并将其添加回远程仓库。

git checkout -b master 734c2b9b   # replace with your commit point

然后将本地分支推送到远程

git push -u origin master

重新添加默认分支和分支保护等。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.