题
我在这里遇到了一个问题:我有一个特定于问题的分支 28s
在 Git 中,我将其合并到常规中 develop
分支。事实证明我做得太快了,所以我使用 git-revert 来撤消合并。然而,现在已经到了合并的时候了 28s
进入 develop
, ,但是 git-merge 命令看到原始合并,并高兴地宣布一切都很好并且分支已经合并。现在我该怎么做?创建“恢复”恢复“28s -> 开发””'提交?这似乎不是一个好方法,但我目前无法想象其他方法。
树结构是什么样子的:
解决方案
你必须“恢复恢复”。取决于你如何恢复它,它可能不像听起来那么容易。看着那(这 关于这个主题的官方文档.
---o---o---o---M---x---x---W---x---Y
/
---A---B-------------------C---D
允许:
---o---o---o---M---x---x-------x-------*
/ /
---A---B-------------------C---D
但这一切都有效吗?当然可以。您可以恢复合并,从纯粹的技术角度来看,git自然而然地做到了,没有真正的麻烦。
它只是认为这是从“合并之前”变为“合并后的状态”的变化,仅此而已。
没什么复杂的,没有什么奇怪的,没有什么真正危险的。Git 会不假思索地做到这一点。因此,从技术角度来看,重新合并没有错,但是 从工作流程角度来看,您通常应该尝试避免.
例如,如果可能的话,如果您发现被合并到主树中的问题, 而不是恢复合并,尝试 真的 难以:
- 将问题平分到您合并的分支中,然后修复它,
- 或者尝试恢复导致它的单个提交。
是的,这更复杂,不,它并不总是能起作用(有时答案是:“糟糕,我真的不应该合并它,因为它还没有准备好,我真的需要撤消 全部 合并”)。因此,您确实应该恢复合并,但是当您想重新进行合并时,您现在需要通过恢复恢复来完成。
其他提示
让我们假设你有这样的历史
---o---o---o---M---W---x-------x-------*
/
---A---B
其中A,B失败提交和W - 是恢复M的
所以我才开始修复发现的问题我不摘樱桃W的承诺我的分支
git cherry-pick -x W
然后我还原W¯¯提交于我的分支
git revert W
在我可以继续固定。
在最后的历史可能看起来像:
---o---o---o---M---W---x-------x-------*
/ /
---A---B---W---W`----------C---D
当我发送PR它将清楚地表明,PR是撤消还原并增加了一些新的提交。
要在不过度破坏工作流程的情况下恢复恢复:
- 创建开发的本地垃圾副本
- 恢复开发本地副本上的恢复提交
- 将该副本合并到您的功能分支中,并将您的功能分支推送到 git 服务器。
当您准备好时,您的功能分支现在应该能够正常合并。这里唯一的缺点是你的历史记录中会有一些额外的合并/恢复提交。
要在GIT还原一个复归:
git revert <commit-hash-of-previous-revert>
而不是使用 git-revert
你可以在 devel
分支到 丢弃 (撤消)错误的合并提交(而不是仅仅恢复它)。
git checkout devel
git reset --hard COMMIT_BEFORE_WRONG_MERGE
这也将相应地调整工作目录的内容。 当心:
- 保存您的更改 在开发分支(由于错误合并)中,因为它们也将被
git-reset
. 。在您指定为git reset
争论就会消失! - 另外,如果您的更改已经从其他存储库中提取,请不要这样做,因为重置将重写历史记录。
我建议学习 git-reset
在尝试此操作之前请仔细阅读手册页。
现在,重置后,您可以重新应用更改 devel
然后做
git checkout devel
git merge 28s
这将是真正的合并 28s
进入 devel
就像最初的那样(现在从Git的历史中删除)。
我面临同样的问题时,才发现这个帖子。我发现上面wayyy吓人做复位顽固派等我将最终删除的东西我不想,也不会能够把它找回来。
相反,我检查了承诺,我想分支回到如git checkout 123466t7632723
。然后转换到分支git checkout my-new-branch
。然后我删除我不希望有更多的分支。当然,如果你能扔掉你搞砸了分公司,这只会工作。
我建议你按照下面的步骤来恢复一个复归,说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
现在创建用于分支users/yourname/revertOfSHA1
PR
- 在原始合并之前的提交时创建新分支 - 将其称为“开发基础”
- 在“develop-base”之上执行“develop”的交互式变基(即使它已经位于顶部)。在交互式变基期间,您将有机会删除合并提交和反转合并的提交,即从 git 历史记录中删除这两个事件
此时,您将拥有一个干净的“开发”分支,您可以像平常一样将功能分支合并到其中。