我的回购现在有100个提交。我需要回滚存储库以提交80个,并删除所有后续的存储库。
Why?
这个回购应该是从杂项用户合并。由于过度的编辑,我提交了一堆合并。这是由于我的远程分支的错误标记,其中3个开发人员被彼此标记。我需要重置到那个点,然后向前拉。
我想要重基,就像在这个例子中:我如何在GitHub上删除提交?
然而,git想让我做很多冲突管理。有没有更简单的方法?
我的回购现在有100个提交。我需要回滚存储库以提交80个,并删除所有后续的存储库。
Why?
这个回购应该是从杂项用户合并。由于过度的编辑,我提交了一堆合并。这是由于我的远程分支的错误标记,其中3个开发人员被彼此标记。我需要重置到那个点,然后向前拉。
我想要重基,就像在这个例子中:我如何在GitHub上删除提交?
然而,git想让我做很多冲突管理。有没有更简单的方法?
当前回答
另一种方法:
签出要恢复的分支,然后将本地工作副本重置为远程服务器上的最新提交(之后的所有内容都将告别)。要做到这一点,在SourceTree中,我右键单击并选择“Reset BRANCHNAME To this commit”。
然后导航到存储库的本地目录并运行以下命令:
git -c diff.mnemonicprefix=false -c core.quotepath=false push -v -f -- tags REPOSITORY_NAME BRANCHNAME:BRANCHNAME
这将删除本地存储库中当前提交之后的所有提交,但只针对该分支。
其他回答
当从master进行分支更新时,我注意到我有时会过度单击,导致分支也合并到master中。找到了补救的方法。
如果你上次提交的是合并,你需要更多的爱:
git恢复-m 1 HEAD
另一种方法:
签出要恢复的分支,然后将本地工作副本重置为远程服务器上的最新提交(之后的所有内容都将告别)。要做到这一点,在SourceTree中,我右键单击并选择“Reset BRANCHNAME To this commit”。
然后导航到存储库的本地目录并运行以下命令:
git -c diff.mnemonicprefix=false -c core.quotepath=false push -v -f -- tags REPOSITORY_NAME BRANCHNAME:BRANCHNAME
这将删除本地存储库中当前提交之后的所有提交,但只针对该分支。
git reset --hard <old-commit-id>
git push -f <remote-name> <branch-name>
注意:正如下面的评论所写的,在协作环境中使用这个是危险的:你正在重写历史
大多数建议都假设你需要以某种方式销毁最后20次提交,这就是为什么它意味着“重写历史”,但你不必这么做。
只需从commit #80创建一个新分支,并继续处理该分支。其他20个提交将留在旧的孤立分支上。
如果您确实希望新分支具有相同的名称,请记住,分支基本上只是标签。只需将旧分支重命名为其他名称,然后在提交#80时使用您想要的名称创建新分支。
要撤消最近的提交,我这样做:
第一:
git log
获取要撤消的最新SHA id。
git revert SHA
这将创建一个与您的提交完全相反的新提交。然后你可以推这个新提交,把你的应用带到它之前的状态,你的git历史将相应地显示这些变化。
这有利于你立即重新做你刚刚做过的事情,我发现这对我来说是更常见的情况。
正如Mike提到的,你也可以这样做:
git revert HEAD