如何撤消合并请求及其提交?

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

【讨论】:

以上是关于如何撤消合并请求及其提交?的主要内容,如果未能解决你的问题,请参考以下文章

撤消 Git 分支提交和合并

如何撤消主分支的合并? [复制]

如何删除推送的 git 合并提交

如何撤消对特定文件的已提交更改而不进行变基?

Git撤消先前的合并,这会阻止差异

如何中止mercurial中的合并?