如何撤消合并请求及其提交?
Posted
技术标签:
【中文标题】如何撤消合并请求及其提交?【英文标题】:How to undo merge request with its commits? 【发布时间】:2019-05-13 07:43:25 【问题描述】:我在 gitlab 上对我的分支 develop
做了一个 merge request
。
然后我意识到我犯了一个巨大的错误。
我迅速按下revert
按钮,我认为一切都好,但不是。
Gitlab 只提交了revert
。在日志中仍然有来自源分支的提交。它会导致许多版本问题。无论如何,任何解决方案都可以在 gitlab 平台上恢复单个合并请求并从许多不需要的提交中清除分支日志。我希望我的分支就像这个合并请求从未有过的地方一样。
【问题讨论】:
你应该阅读the differences between git revert and git reset。 【参考方案1】:首先创建一个新分支keepsafe
以将所有这些更改保留在某处,以防万一您搞砸了。这将在本地“复制”当前状态并将其保存到远程。
git checkout -b keepsafe
git push
现在回去开发。 X
是您要删除的提交数。
git checkout develop
git reset --hard HEAD~X
git push -f
将本地开发硬重置为原始提交。 git push -f
将覆盖远程分支。所有提交都将消失。
请注意,GitLab 允许管理员禁用强制推送 (git push -f),因此如果这不起作用,您需要与管理员交谈。
【讨论】:
【参考方案2】:您可以使用交互式 rebase 恢复到之前的提交。假设您想将 HEAD 恢复为 HEAD~5(之前提交了 5 次),您可以选择 HEAD~5 的父级,即 HEAD~6,然后在其上应用 HEAD~5。
git rebase -i HEAD~6
HEAD~6 到 HEAD 之间的每次提交都会被重写。说 HEAD~5 SHA1 是 ABC & HEAD~6 SHA1 是 XYZ。当前的 HEAD 是 PQR。我们需要从下面的编辑中删除其他提交,因为我们不想在 HEAD~6 上重写它们。我们只想在 HEAD~6 之上应用 HEAD~5。我们应该在这个文件中至少有一个条目,否则 rebase 将中止。所以,我们在 HEAD~6 之上应用 HEAD~5。
edit ABC reverting to state before merge
# Rebase XYZ..PQR onto XYZ
#
# Commands:
# p, pick = use commit
# r, reword = use commit, but edit the commit message
# e, edit = use commit, but stop for amending
# s, squash = use commit, but meld into previous commit
# f, fixup = like "squash", but discard this commit's log message
# x, exec = run command (the rest of the line) using shell
#
# These lines can be re-ordered; they are executed from top to bottom.
#
# If you remove a line here THAT COMMIT WILL BE LOST.
#
# However, if you remove everything, the rebase will be aborted.
#
# Note that empty commits are commented out
现在,发出以下命令来修改历史记录并输入提交信息。
git commit --amend
现在,发出以下命令以继续并退出编辑器
git commit --continue
阅读更多rewriting git history
【讨论】:
以上是关于如何撤消合并请求及其提交?的主要内容,如果未能解决你的问题,请参考以下文章