Answers:
您必须“还原还原”。取决于您如何还原原始内容,它可能听起来并不那么容易。查看有关此主题的正式文档。
---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 commit
git revert W
之后,我可以继续修复。
最终历史可能如下所示:
---o---o---o---M---W---x-------x-------*
/ /
---A---B---W---W`----------C---D
当我发送PR时,它将清楚地表明PR是撤消还原并添加了一些新的提交。
要还原还原而又不会过多浪费您的工作流程,请执行以下操作:
现在,您的功能分支现在应该可以正常合并了。唯一的缺点是您的历史记录中会有一些额外的合并/还原提交。
而不是使用的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的历史擦除)。
reset --hard
和push origin
。另请注意,强行推入原籍可能会真正掩盖GitHub上的公开PR。
我建议您按照以下步骤还原一个还原,例如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
现在为分支创建PR users/yourname/revertOfSHA1
此时,您将拥有一个干净的'develop'分支,您可以像往常一样合并功能分支。