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

时间:2018-12-12 08:37:49

标签: git gitlab git-merge git-revert

我在gitlab的分支<script src="https://cdnjs.cloudflare.com/ajax/libs/vue/2.5.17/vue.js"></script> <div id="container"> <my-component :data=$data @click-me="clickMe"></my-component> </div>上做了merge request。 然后我意识到自己犯了一个巨大的错误。 我迅速按下了develop按钮,我认为这没事,不是。 Gitlab仅提交revert次提交。在日志中,仍然有来自源分支的提交。这会导致许多版本问题。无论如何,任何解决方案都可以在gitlab平台上还原单个合并请求,并从许多不需要的提交中清除分支日志。我希望我的分支像此合并请求再也没有位置。

2 个答案:

答案 0 :(得分:2)

首先创建一个新分支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),因此,如果这不起作用,则需要与管理员联系。但是您可能还是应该这样做。

答案 1 :(得分:0)

您可以使用交互式基准库恢复到先前的提交。假设您想将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