我的代码库当前有100个提交。我需要将代码库回滚到第80个提交,并删除所有随后的提交。
为什么要这样做?
这个代码库是用来合并来自各种用户的代码的。由于编辑过度,一堆合并被作为我的提交提交了进去。这是由于我的远程分支错标导致的,其中3个开发者被错误地标记为彼此。我需要重置到该点,然后再向前拉取。
我想像这个例子中那样进行变基:如何在GitHub上删除提交?
然而,Git要求我做很多冲突管理,有更简单的方法吗?
我的代码库当前有100个提交。我需要将代码库回滚到第80个提交,并删除所有随后的提交。
为什么要这样做?
这个代码库是用来合并来自各种用户的代码的。由于编辑过度,一堆合并被作为我的提交提交了进去。这是由于我的远程分支错标导致的,其中3个开发者被错误地标记为彼此。我需要重置到该点,然后再向前拉取。
我想像这个例子中那样进行变基:如何在GitHub上删除提交?
然而,Git要求我做很多冲突管理,有更简单的方法吗?
git reset --hard <old-commit-id>
git push -f <remote-name> <branch-name>
注意:正如下面的评论所写,在协作环境中使用这个是很危险的:你正在重写历史
要撤销最近的提交,我需要执行以下操作:
首先:
git log
获取最新的SHA ID以进行撤销。
git revert SHA
这将创建一个新的提交,它会完成与您的提交完全相反的操作。然后,您可以推送此新提交以将应用程序恢复到之前的状态,您的git历史记录将相应地显示这些更改。
对于我发现的情况更多的是,这对于立即重做刚刚提交的内容非常有用。
正如Mike提到的,您也可以这样做:
git revert HEAD
git revert HEAD
可以撤销最近一次的提交,而无需查找哈希值。 - Mike Baranczak另一种方法:
检出要还原的分支,然后将本地工作副本重置回您想要成为远程服务器上最新版本的提交(它之后的所有内容都将消失)。在SourceTree中,我右键单击并选择“将BRANCHNAME重置为此提交”来执行此操作。
然后导航到存储库的本地目录,并运行此命令:
git -c diff.mnemonicprefix=false -c core.quotepath=false push -v -f -- tags REPOSITORY_NAME BRANCHNAME:BRANCHNAME
这将在您的本地代码库中,从当前分支开始擦除所有提交记录,但仅针对该分支。
https:/me@github.com/me/repo_name.git
- tim大多数建议都假定你需要某种方式销毁最后的20个提交,这就是所谓的“重写历史”的原因,但你并不需要这样做。
只需从提交号为80的提交上创建一个新分支,并在该分支上进行后续工作。另外的20个提交将保留在旧的分支中。
如果你绝对想让你的新分支具有相同的名称,请记住分支基本上只是标签。将你的旧分支重命名为其他名称,然后以你想要的名称在提交号为80的提交上创建新的分支即可。
当我从主分支更新分支时,有时候会误操作导致将分支合并到主分支中。发现了一种撤销的方法。
如果你的最后一次提交是一个合并操作,需要做更多的处理:
git revert -m 1 HEAD
在 GitHub 上,最简单的方法是在分支选项卡下使用 GitHub UI 删除远程分支。您必须确保删除以下设置才能使分支可删除:
现在,在本地存储库中重新创建它,以指向以前的提交点,并将其添加回远程存储库。
git checkout -b master 734c2b9b # replace with your commit point
git push -u origin master
git log
切换分支:(注1)
git checkout branch_name
本地备用方案:
git reset --soft commitID
git reset --hard commitID
git push origin HEAD --force
(注意 2) 如果你遇到错误消息“fatal: unable to access 'https://github.com/xxxxx/xxxxxxx.git/': OpenSSL SSL_read: Connection was reset, errno 10054”,原因可能是服务器的 SSL 证书没有由第三方签名。要解决此问题,你可以在 Git Bash 中输入 git config --global http.sslVerify "false"
以禁用 SSL 验证,然后再尝试操作。*
git push -f origin branch
。我之前犯了这个错误,导致遇到了麻烦。请务必注意。 - Sumit M Asokgit push origin HEAD --force
而不是git push -f origin branch
,因为后者会给我一个error: src refspec branch does not match any.
的错误提示。 - sprocket12