如何在git push之后撤销一个git提交?

10

从这里http://blog.prabir.me/post/Undo-in-Git.aspx收集的信息如下:

This undo’s your commit and also resets your working tree to the last commit.

1 git reset --hard HEAD^

在我执行了'git push'之后,如何撤销我的最后一次提交?

谢谢。

当我执行'git log'时,我的最新提交是:

commit 29fc764693a5933a379169e22891e4b0d3d2426f
Merge: 002db49 cfb1d8f

如何撤销一个 Git 的修改?

我得到了这个:

$ git revert HEAD 
fatal: Commit 29fc764693a5933a379169e22891e4b0d3d2426f is a merge but no -m option was given.
4个回答

16
您可以使用 git revert HEAD,它会生成一个新的提交记录,用于撤销先前提交所做的更改。在这里查看详情here。请注意,无论是提交记录还是撤销提交记录都将显示在历史记录中。

编辑:正如KingChrunch提到的,当撤销合并提交时,您需要指定要还原到哪个父级,因此添加-m <parent>。当然,只需跟随我发布的链接就可以了解这一点。

您不能(或者说不应该)修改共享存储库的历史记录。如果您想修改历史记录(请不要这样做),可以使用git resetgit push --forcegit rebase


当我执行 'git revert HEAD' 时出现 'fatal: Commit 29fc764693a5933a379169e22891e4b0d3d2426f is a merge but no -m option was given.' 这个错误是什么意思? - michael
1
git revert 返回到之前的提交。如果您想要还原合并提交,那就不那么容易了,因为它至少有两个父提交,没有人能够确定哪一个是分支,哪一个是/是合并父提交。您必须使用 -m <parent commit> 选项选择要提交到哪个父提交。请查看 git help revert - KingCrunch

2

您应该使用git revert来撤销提交。

git reset之后,您也可以使用git push --force推送分支,但如果在此之前有人拉取了您的分支,则您的历史记录会发生分歧,因此不建议这样做。


好的。但是我已经执行了'git commit'和'git push',因为我想回滚我的更改,所以我执行了'git reset --soft HEAD^',并且我想在没有这个更改的情况下测试我的代码,我执行了'git stash build and test'。现在,在执行'git revert'之前,我需要执行'git stash pop'吗? - michael

1

0

如果您正在使用GitLab和代码审查/合并请求步骤,则刚刚发现了一种更简单的方法。在提交和推送时意外包含不必要的文件后,我发现了这个方法。您还可以使用此方法在合并之前对其进行编辑和重新提交。

我们的流程:编码后,我们提交,从上游获取,变基,推送到GitLab。这将在GitLab上创建一个分支,然后我们为该分支创建合并请求。这是为了确保所有代码在进入主分支之前都得到同行的代码审查。在这种情况下,我的同行审查同事发现了我的错误,这是一个非常有用的步骤。

注意:这仅适用于合并请求被接受之前的选项。

要在推送到GitLab之后但在合并之前从提交中删除文件,请执行以下操作:

  1. 打开GitLab合并请求
  2. 选择“更改”选项卡
  3. 找到提交中不需要的文件
  4. 单击文件的“查看文件”按钮
  5. 单击“删除”按钮
  6. 输入提交信息并提交更改

您的合并请求现已修复,并从提交中删除了不需要的文件。现在可以合并(如果其余部分通过代码审查)。

您也可以通过这种方式编辑和重新提交文件。这是一种简单的方法,可以快速修复问题,而无需打开Eclipse/IntelliJ(或其他工具)并检出分支。

这刚刚让我省了好几个小时的痛苦,避免了在Eclipse中从推送的分支中删除文件的麻烦。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接