微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

恢复远程分支上的提交

如何解决恢复远程分支上的提交

我对我的主分支做了两次提交,然后被推送到远程分支。

我现在决定在这两次提交之前返回我的原始代码,因此选择了我的原始提交并使用 Reset Master to Commit(使用 SourceTree)。然后我做了一些更改并提交。

问题是当我尝试推送到遥控器时,它告诉我需要先获取。我可以通过强制推送来解决这个问题,但我想保留我的提交历史。

这可以不创建新分支吗?

解决方法

您将不得不创建一个合并修订版..... 有一个转折:您将不得不要求 git 真的跳过合并并保持内容不变位于您的本地 分支中,以便 git 可以理解您实际上取回了内容。

git commit-tree -m "Merging so that I can keep the revisions I reverted" -p HEAD -p origin/master HEAD^{tree}

因此,您正在创建一个新的合并修订版,它将以您当前的本地修订版/分支以及远程分支上的内容作为父级。它将保持(文件及其内容)在您的本地分支中。这将打印一个修订版的 ID。在 gitk 或 git log 中查看它或检查修订版并确保一切正常。如果是这种情况,则将分支放在该修订版上:

# if you didn't checkout the revision run the following command
git merge the-id-we-are-talking-about

# if you did checkout the revision,then let's put the branch where we are right now
git branch -f master # set master where we are
git checkout master

在您运行这两个命令中的任何一个之后,根据您所在的位置和内容,现在您可以推送您的本地 master

git push
,

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 manual:“给定一个或多个现有提交,还原相关补丁引入的更改,并记录一些记录它们的新提交。”

所以现在分支 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 上执行还原,但如此处所示,它更简单。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。