我在这里遇到了一些问题:我在Git中有一个特定于问题的分支28s
,我在一般的develop
分支中合并。事实证明我做得太快了,所以我使用git-revert来撤消合并。然而,现在是将28s
合并到develop
的时候了,但是git-merge命令看到了原始合并,并且愉快地宣布一切都很好并且分支已经合并。现在我该怎么做?创建'还原'还原“28s - >发展“”承诺?似乎不是一个很好的方法,但我现在无法想象任何其他。
树结构是什么样的:
答案 0 :(得分:144)
你必须“恢复还原”。取决于你是如何回复的,它可能不像听起来那么容易。查看official document on this topic。
---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会在没有考虑它的情况下做到这一点。因此从技术角度来看,恢复合并并没有错, 但从工作流角度来看,这是你通常应该尝试的事情 避免强>
如果可能的话,例如,如果您发现合并的问题 进入主树,而不是恢复合并,尝试真的难以:
- 将问题分解为您合并的分支,然后修复它,
- 或尝试还原导致它的单个提交。
是的,它更复杂,不,它并不总是有效(有时候 答案是:“哎呀,我真的不应该合并它,因为它不是 准备好了,我真的需要撤消所有的合并“)。那么你 真的应该还原合并,但是当你想重新合并时,你 现在需要通过还原恢复来实现。
答案 1 :(得分:44)
我们假设你有这样的历史
---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是撤消还原并添加一些新提交。
答案 2 :(得分:6)
要在不过多搞砸工作流程的情况下恢复还原:
现在,当您准备好时,您的功能分支应该能够正常合并。这里唯一的缺点是你在历史上会有一些额外的合并/恢复提交。
答案 3 :(得分:5)
要还原GIT中的还原,
git revert <commit-hash-of-previous-revert>
答案 4 :(得分:3)
您可以在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的历史中删除。)
答案 5 :(得分:1)
我遇到同样的问题时才发现这篇文章。我发现上面的方式可怕做重置硬盘等。我最终会删除我不想要的东西,并且无法取回它。
相反,我检查了我希望分支返回到例如的提交。 git checkout 123466t7632723
。然后转换为分支git checkout my-new-branch
。然后我删除了我不想要的分支。当然,只有当你能够扔掉你搞砸的树枝时,这才有效。
答案 6 :(得分:1)
这时,您将拥有一个干净的'develop'分支,您可以像往常一样合并功能分支。
答案 7 :(得分:0)
我建议您按照以下步骤还原一个还原,例如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。