Git 还原远程分支上的提交

Git 还原远程分支上的提交,git,version-control,atlassian-sourcetree,Git,Version Control,Atlassian Sourcetree,我对主分支做了两次提交,然后将它们推送到远程分支 我现在决定回到这两次提交之前的原始代码,因此选择了使用Reset Master提交的原始提交(使用SourceTree)。然后我做了一些更改并提交了这些 问题是当我试图推到遥控器时,它告诉我需要先取。我可以通过强制推来解决这个问题,但我想保留我的提交历史 在不创建新分支的情况下是否可以执行此操作?您必须创建合并修订版。。。。。有一个转折点:您必须要求git真正跳过合并并保留本地分支中的内容,以便git能够理解您实际上收回了内容 git commi

我对主分支做了两次提交,然后将它们推送到远程分支

我现在决定回到这两次提交之前的原始代码,因此选择了使用Reset Master提交的原始提交(使用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日志中查看它,或者签出修订版,确保一切看起来都是正确的。如果是这种情况,则将分支放在该修订版上:

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

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

git push

您必须创建一个合并修订。。。。。有一个转折点:您必须要求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日志中查看它,或者签出修订版,确保一切看起来都是正确的。如果是这种情况,则将分支放在该修订版上:

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

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

git push

TL;DR使用
git revert
撤消要删除的提交,方法是记录正在撤消的事实,然后合并或重新设置基础

详细信息

为了使您的历史记录在将来尽可能容易理解,我将首先在主分支上恢复您不希望保留的两个提交

由于您已经提交了要保留的本地
master
分支,因此我将临时在
origin/master
上创建另一个分支,以简化操作

git签出源/主
git签出-b dev.about-to-revert
现在,创建“恢复”提交以撤消不希望保留的两个提交:

git还原
git还原
来自:“给定一个或多个现有提交,还原相关修补程序引入的更改,并记录一些记录这些更改的新提交。”

因此,现在branch
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:您问“不创建新分支,这是否可行”。我假设您不想在远程上推送一个新分支,但是在您的沙箱中临时创建一个分支仍然可以。有很多方法可以在没有新分支的情况下执行我在这里展示的相同操作,在分离的磁头上执行恢复,但如图所示更简单。

TL;DR使用
git revert
撤消要删除的提交,方法是记录正在撤消的事实,然后合并或重新设置基础

详细信息

为了使您的历史记录在将来尽可能容易理解,我将首先在主分支上恢复您不希望保留的两个提交

由于您已经提交了要保留的本地
master
分支,因此我将临时在
origin/master
上创建另一个分支,以简化操作

git签出源/主
git签出-b dev.about-to-revert
现在,创建“恢复”提交以撤消不希望保留的两个提交:

git还原
git还原
来自:“给定一个或多个现有提交,还原相关修补程序引入的更改,并记录一些记录这些更改的新提交。”

因此,现在branch
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:您问“不创建新分支,这是否可行”。我假设您不想在远程上推送一个新分支,但是在您的沙箱中临时创建一个分支仍然可以。有很多方法可以在没有新分支的情况下执行我在这里展示的相同操作,在分离的磁头上执行恢复,但如图所示更简单。

这是一个不错的解决方案,但会让历史变得很难理解。我建议使用git revert撤消“错误”的提交,然后执行正常的合并或重新基础,这样就有一个明确的撤消提交的历史记录。这是一个不错的解决方案,但会使历史记录很难理解。我建议使用git revert撤消“坏”提交,然后执行正常的合并或重基,这样就有一个明确的撤消历史