恢复远程分支上的提交
Reverting commits on remote branch
我对我的 Master 分支做了两次提交,然后将其推送到远程分支。
我现在决定在这两个提交之前返回到我的原始代码,因此选择了我的原始提交并使用 Reset Master to Commit(使用 SourceTree)。然后我做了一些更改并提交了这些。
问题是当我尝试推送到远程时它告诉我需要先获取。我可以通过强制推送来解决这个问题,但我想保留我的提交历史记录。
这是否可以不创建新分支?
您将不得不创建一个合并修订..... 有一个转折:您将不得不问 git 到 真的 跳过合并并保留 local 分支中的内容,以便 git 可以理解您实际上取回了内容。
git commit-tree -m "Merging so that I can keep the revisions I reverted" -p HEAD -p origin/master HEAD^{tree}
因此,您正在创建一个新的合并修订版本,它将以您当前的本地 revision/branch 和远程分支上的内容作为父版本。它将保留 tree(文件及其内容),因为它们在您的 local 分支中。这将打印一个修订版的 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
在你有 运行 这两个命令中的任何一个之后,取决于你在哪里和东西,现在你可以推送你的本地主机
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 上执行还原,但它更简单,如此处所示。
我对我的 Master 分支做了两次提交,然后将其推送到远程分支。
我现在决定在这两个提交之前返回到我的原始代码,因此选择了我的原始提交并使用 Reset Master to Commit(使用 SourceTree)。然后我做了一些更改并提交了这些。
问题是当我尝试推送到远程时它告诉我需要先获取。我可以通过强制推送来解决这个问题,但我想保留我的提交历史记录。
这是否可以不创建新分支?
您将不得不创建一个合并修订..... 有一个转折:您将不得不问 git 到 真的 跳过合并并保留 local 分支中的内容,以便 git 可以理解您实际上取回了内容。
git commit-tree -m "Merging so that I can keep the revisions I reverted" -p HEAD -p origin/master HEAD^{tree}
因此,您正在创建一个新的合并修订版本,它将以您当前的本地 revision/branch 和远程分支上的内容作为父版本。它将保留 tree(文件及其内容),因为它们在您的 local 分支中。这将打印一个修订版的 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
在你有 运行 这两个命令中的任何一个之后,取决于你在哪里和东西,现在你可以推送你的本地主机
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 上执行还原,但它更简单,如此处所示。