Tom*_*oss 207 git git-merge git-revert
我在这里遇到了一个问题:我28s在Git中有一个特定于问题的分支,我在一般develop分支中合并.事实证明我做得太快了,所以我使用git-revert来撤消合并.然而,现在是合并的时候28s了develop,但是git-merge命令看到了原始的合并,并且愉快地宣布一切都很好并且分支已经合并.现在我该怎么做?创建'还原'还原"28s - >开发""提交?似乎不是一个很好的方法,但我现在无法想象任何其他.
树结构是什么样的:

J-1*_*DiZ 153
你必须"恢复还原".取决于你是如何回复的,它可能不像听起来那么容易.查看有关此主题的官方文档.
---o---o---o---M---x---x---W---x---Y
/
---A---B-------------------C---D
Run Code Online (Sandbox Code Playgroud)
允许:
---o---o---o---M---x---x-------x-------*
/ /
---A---B-------------------C---D
Run Code Online (Sandbox Code Playgroud)
但这一切都有效吗?当然可以.你可以恢复合并,从纯粹的技术角度来看,git非常自然地做到了,没有真正的麻烦.
它只是认为它是从"合并前的状态"到"合并后的状态"的变化,就是这样.
没有什么复杂的,没有什么奇怪的,没有什 Git会在没有考虑它的情况下做到这一点.因此,从技术角度来看,恢复合并没有任何问题,但从工作流角度来看,这通常是您应该尽量避免的.
如果可能的话,例如,如果发现得到了合并到主树,出了问题,而不是恢复合并,尽量真的很难:
- 将问题平分到您合并的分支中,然后修复它,
- 或尝试还原导致它的单个提交.
是的,它更复杂,不,它并不总是能够工作(有时答案是:"哎呀,我真的不应该合并它,因为它还没有准备好,我真的需要撤消所有的合并").那么你真的应该恢复合并,但是当你想重新进行合并时,你现在需要通过恢复恢复来做到这一点.
Mak*_*yar 51
我们假设你有这样的历史
---o---o---o---M---W---x-------x-------*
/
---A---B
Run Code Online (Sandbox Code Playgroud)
其中A,B失败提交,W - 恢复M
所以在我开始修复发现问题之前,我会选择W提交给我的分支机构
git cherry-pick -x W
Run Code Online (Sandbox Code Playgroud)
然后我在我的分支上恢复W commit
git revert W
Run Code Online (Sandbox Code Playgroud)
我可以继续修复.
最终的历史可能如下:
---o---o---o---M---W---x-------x-------*
/ /
---A---B---W---W`----------C---D
Run Code Online (Sandbox Code Playgroud)
当我发送PR时,它将清楚地显示PR是撤消还原并添加一些新的提交.
要在不搞砸工作流程的情况下还原恢复,请执行以下操作:
现在,当您准备好时,您的功能分支应该能够正常合并.这里唯一的缺点是你在历史上会有一些额外的合并/恢复提交.
要还原GIT中的还原,请执行以下操作:
git revert <commit-hash-of-previous-revert>
Run Code Online (Sandbox Code Playgroud)
而不是使用的git-revert,你可以在已经使用这个命令devel分支扔掉(撤消)错误的合并提交(而不仅仅是恢复它)。
git checkout devel
git reset --hard COMMIT_BEFORE_WRONG_MERGE
Run Code Online (Sandbox Code Playgroud)
这也将相应地调整工作目录的内容。小心:
git-reset. 在您指定为git reset参数之后的所有提交都将消失!我建议git-reset在尝试之前仔细研究手册页。
现在,重置后您可以重新应用您的更改devel,然后执行
git checkout devel
git merge 28s
Run Code Online (Sandbox Code Playgroud)
这将是一个真正的融合28s到devel像最初的一个(现在是从Git的历史擦除)。