我们正在Git中执行还原的合并
我在这里遇到了一点问题:我在Git中有一个特定于问题的分支我们正在Git中执行还原的合并,git,git-merge,git-revert,Git,Git Merge,Git Revert,我在这里遇到了一点问题:我在Git中有一个特定于问题的分支28s,我将其合并到generaldevelop分支中。原来我做得太快了,所以我用git revert撤消合并。然而,现在是将28s合并到develope中的时候了,但是git merge命令看到了最初的合并,并愉快地宣布一切都很好,分支已经合并。我现在该怎么办?创建“还原”还原“28s->开发”“提交?这似乎不是一个好办法,但我现在无法想象还有其他办法 树结构的外观: 您必须“还原还原”。取决于您如何还原原始版本,它可能不像听起来那么容
28s
,我将其合并到generaldevelop
分支中。原来我做得太快了,所以我用git revert撤消合并。然而,现在是将28s
合并到develope
中的时候了,但是git merge命令看到了最初的合并,并愉快地宣布一切都很好,分支已经合并。我现在该怎么办?创建“还原”还原“28s->开发”“提交?这似乎不是一个好办法,但我现在无法想象还有其他办法
树结构的外观:
您必须“还原还原”。取决于您如何还原原始版本,它可能不像听起来那么容易。看这张照片
允许:
---o---o---o---M---x---x-------x-------*
/ /
---A---B-------------------C---D
但这一切都有效吗?当然有。您可以还原合并,也可以从
纯粹从技术角度来看,git做得很自然,没有真正的优势
麻烦。它只是认为这是从“合并前状态”到 “合并后的状态”,就是这样。
没有复杂,没有奇怪, 没有什么真正危险的。Git甚至不会去想它 因此,从技术角度来看,恢复合并没有错, 但是从工作流的角度来看,您通常应该尝试这样做 避免 如果可能的话,例如,如果您发现一个问题被合并了 在主目录树中,而不是还原合并,请尽全力执行以下操作:
- 将问题平分到合并的分支中,然后修复它
- 或者尝试还原导致它的单个提交
您可以在
devel
分支中使用此命令来丢弃(撤消)错误的合并提交,而不是使用git revert
这也将相应地调整工作目录的内容小心点:
- 将更改保存到“开发”分支中(因为合并错误),因为它们
也会被git reset清除。在指定为的提交之后的所有提交
参数将消失李>git reset
- 另外,如果您的更改已经从其他存储库中提取,请不要这样做 因为重置将重写历史记录
git reset
手册页
现在,重置后,您可以在devel
中重新应用更改,然后执行以下操作
git checkout devel
git merge 28s
这将是从28s
到devel
的真正合并,就像最初的合并(现在是
从git的历史记录中删除)。让我们假设您有这样的历史记录
---o---o---o---M---W---x-------x-------*
/
---A---B
其中A、B提交失败,W-是M的还原
因此,在我开始修复发现的问题之前,我会认真挑选W,并将其提交给我的分支机构
git cherry-pick -x W
git revert W
然后我在我的分支上回复W commit
git cherry-pick -x W
git revert W
之后我可以继续修理
最终的历史可能如下所示:
---o---o---o---M---W---x-------x-------*
/ /
---A---B---W---W`----------C---D
当我发送PR时,它将清楚地显示PR是“撤消还原”,并添加一些新的提交。要还原还原,而不会过多地扰乱您的工作流程,请执行以下操作:
- 创建开发的本地垃圾副本
- 在develop的本地副本上还原还原提交
- 将该副本合并到功能分支中,并将功能分支推送到git服务器
您的功能分支现在应该可以在准备就绪时正常合并。这里唯一的缺点是,您的历史记录中会有一些额外的合并/还原提交。我在遇到同样的问题时发现了这篇文章。我发现上面的方法很可怕,我会删除一些我不想删除的东西,并且无法恢复
相反,我签出了我希望分支返回的提交,例如,
git checkout 123466t7632723
。然后转换为分支git签出我的新分支。然后我删除了我不想要的分支。当然,只有当您能够扔掉弄乱的分支时,这才有效。要在GIT中还原还原,请执行以下操作:
git revert <commit-hash-of-previous-revert>
git还原
我建议您按照以下步骤还原还原,例如SHA1
git checkout develop #go to develop branch
git pull #get the latest from remote/develop branch
git branch users/yourname/revertOfSHA1 #having HEAD referring to develop
git checkout users/yourname/revertOfSHA1 #checkout the newly created branch
git log --oneline --graph --decorate #find the SHA of the revert in the history, say SHA1
git revert SHA1
git push --set-upstream origin users/yourname/revertOfSHA1 #push the changes to remote
现在为分支机构创建PRusers/yourname/revertOfSHA1
在原始合并之前提交时创建新分支-称之为“开发基础”
在“开发基础”的顶部执行“开发”的交互式重基(即使它已经在顶部)。在交互式重新基址期间,您将有机会删除合并提交和反转合并的提交,即从git历史中删除这两个事件
此时,您将拥有一个干净的“开发”分支,您可以像往常一样将功能分支合并到该分支。良好链接(+1)。我冒昧地在您的回答中复制了部分文档,以便读者能够立即看到本案例中的相关选项。如果你不同意,请随时回复。我们刚刚遇到了一个需要这样做的案例,发现乐趣并没有到此为止。这是一个合并的长期运行的分支,所以我们需要继续更新它。我的方法是:@jdwyah这似乎是一个断开的链接,但听起来很有趣。这里有一个archive.org镜像,但它缺少图像:博客帖子已经复活,谢谢:我也跟着@jdwyah帖子。它工作得很好,我只会将“git revert SHA_OF the_MERGE_revert_REVERSION”更改为“SHA_OF the_revert_MERGE”或类似的内容。它是GitX()