git - 恢复远程分支上的提交
问题描述
我向我的主分支提交了两次提交,然后将它们推送到远程分支。
我现在决定在这两个提交之前回到我的原始代码,因此选择了我的原始提交,并使用 Reset Master 来提交(使用 SourceTree)。然后我做了一些改变并提交了这些。
问题是当我尝试推送到遥控器时,它告诉我需要先获取。我可以通过强制推送来解决这个问题,但我想保留我的提交历史。
如果不创建新分支,这可能吗?
解决方案
TL;DR用于git revert
撤消要删除的提交,以记录您正在撤消它们的事实,然后合并或变基。
细节
为了使您的历史记录在将来尽可能容易理解,我将首先在 master 分支上恢复您不想保留的两个提交。
由于您在master
要保留的本地分支上有提交,因此我将暂时创建另一个分支origin/master
以使事情变得更简单。
git checkout origin/master
git checkout -b dev.about-to-revert
现在,创建“还原”提交以撤消您不想保留的两个提交:
git revert <commit to revert>
git revert <commit to revert>
来自git revert 手册:“给定一个或多个现有提交,还原相关补丁引入的更改,并记录一些记录它们的新提交。”
因此,现在分支dev.about-to-revert
的代码与两次提交之前的代码相同origin/master
,您可以在新工作中变基或合并。
变基:
git checkout master
git rebase dev.about-to-revert
或合并
git checkout master
git merge dev.about-to-revert
如果您希望合并的父级在另一个方向上,或者以另一种方式合并:
git merge master
git checkout master
git merge dev.about-to-revert
现在你已经完成了,dev.about-to-revert
所以你可以摆脱它:
git branch -d dev.about-to-revert
PS:您问“是否可以在不创建新分支的情况下这样做”。我假设您不想在远程推送一个新分支,但是在您的沙箱中临时创建一个仍然可以。有一些方法可以在没有新分支的情况下执行我在这里展示的相同操作,在分离的 HEAD 上执行还原,但它更简单,如下所示。
推荐阅读
- mysql - 当我尝试从 Mysql 中获取数据时出现此问题 客户端中的握手错误(OS ErrorWRONG_VERSION_NUMBER(tls_record.cc:242)
- ios - 打开本机应用程序时,深度链接不适用于某些设备
- c# - C# eBay 分类 API Get_Category_Suggestions
- c++ - 在构造函数调用后使用 new 内部构造函数创建的变量设置为 0
- date - 如何在 Access DB 中将日期转换为“mm/dd/yyyy”格式的字符串?
- r - 分组数据框中的周期性数据
- python - 获取创建文件的名称
- python - 为什么 Cloud Tasks 会在 60 秒后出现“超出期限”错误?
- angular - Angular Material 组件未正确显示
- vba - 如何复制/粘贴部分行