120

我犯了一个错误,我不知道如何删除我在存储库中的最新推送。我拉取了应用程序的最新更新,但它有冲突,我将它推送到存储库。

如何删除我的最后一次提交?或者如何解决?

4

10 回答 10

110

首先,如果您与其他人在同一个代码存储库上工作,则不应删除提交,因为当您强制对存储库进行更新时,它将使您同事的本地存储库处于非法状态(例如,如果他们在您删除的提交之后进行提交,这些提交将无效,因为它们基于现在不存在的提交)。

就是说,您可以做的是还原提交。根据您使用的 CVS,此过程的执行方式不同(不同的命令):

git上:

git revert <commit>

mercurial上:

hg backout <REV>

编辑: 还原操作创建一个与还原提交相反的新提交(例如,如果原始提交添加了一行,则还原提交删除该行),有效地删除了不需要的提交的更改,而无需重写存储库历史记录。

于 2013-02-13T16:39:13.337 回答
103

如果您与其他人一起工作(或者很乐意给他们带来很大的烦恼),那么可以从 bitbucket 分支中删除提交。

如果您尝试更改非主分支:

git reset HEAD^               # remove the last commit from the branch history
git push origin :branch_name  # delete the branch from bitbucket
git push origin branch_name   # push the branch back up again, without the last commit

如果您尝试更改主分支

一般来说,在 git 中,master 分支并不特殊——它只是一个约定。但是,bitbucket 和 github 以及类似的站点通常需要有一个主分支(大概是因为它比编写更多代码来处理存储库没有分支的事件更容易 - 不确定)。因此,您需要创建一个新分支,并将其设为主分支:

# on master:
git checkout -b master_temp  
git reset HEAD^              # undo the bad commit on master_temp
git push origin master_temp  # push the new master to Bitbucket

在 Bitbucket 上,转到存储库设置,并将“主分支”更改为master_temp(在 Github 上,更改“默认分支”)。

git push origin :master     # delete the original master branch from Bitbucket
git checkout master
git reset master_temp       # reset master to master_temp (removing the bad commit)
git push origin master      # re-upload master to bitbucket

现在转到 Bitbucket,您应该会看到您想要的历史记录。您现在可以转到设置页面并将 Main 分支更改回master.

此过程也适用于任何其他历史更改(例如git filter-branch)。在新历史与旧历史分离之前,您只需确保重置为适当的提交。

编辑:显然你不需要去 github 上的所有这些麻烦,因为你可以强制推送一个重置分支

与恼怒的合作者打交道

下次有人尝试从您的存储库中拉取时(如果他们已经拉取了错误的提交),拉取将失败。他们必须在更改历史记录之前手动重置为提交,然后再次拉取。

git reset HEAD^
git pull

如果他们拉出了错误的提交,并在它之上提交,那么他们将不得不重置,然后git cherry-pick他们想要创建的好的提交,有效地重新创建整个分支而没有错误的提交。

如果他们从未拉过错误的提交,那么整个过程不会影响他们,他们可以正常拉动。

于 2014-09-01T04:18:53.510 回答
58

你可以重置HEAD^然后强制推动它。

git reset HEAD^
git push -u origin master --force

它将删除您的最后一次提交,并将在 bitbucket 上反映为提交已删除,但仍将保留在其服务器上。

于 2015-08-09T18:10:53.123 回答
16

这是一个最多 4 个步骤的简单方法:

0 - 建议您要修复存储库的团队

与团队联系,让他们知道即将发生的变化。

1 - 删除最后一次提交

假设您的目标分支是master

$ git checkout master              # move to the target branch
$ git reset --hard HEAD^           # remove the last commit
$ git push -f                      # push to fix the remote

如果你是一个人工作,此时你就完成了。

2 - 修复队友的本地存储库

在你队友的:

$ git checkout master              # move to the target branch
$ git fetch                        # update the local references but do not merge  
$ git reset --hard origin/master   # match the newly fetched remote state

如果你的队友没有新的提交,你就完成了,你应该同步。

3 - 恢复丢失的提交

假设一个队友有一个新的未发布的提交在这个过程中丢失了。

$ git reflog                       # find the new commit hash
$ git cherry-pick <commit_hash>

根据需要对尽可能多的提交执行此操作。

我已经多次成功地使用过这种方法。它需要团队的努力来确保一切都是同步的。

于 2019-09-25T05:24:38.487 回答
4

这个命令对我很有效!!

就我而言,我的队友使用错误的代码完成了提交。所以无论如何我都必须恢复那个提交,所以我试图

运行此命令以 REVERT 提交

git revert [LastCommitID]

在此之后,更改未反映在存储库中,因此

我执行了这个命令

git push --force origin master

并且此命令通过删除最后一次提交来反映更改

于 2021-07-08T06:45:25.363 回答
3

我过去在使用 git revert 时遇到过麻烦(主要是因为我不太确定它是如何工作的。)由于合并问题,我在还原时遇到了麻烦..

我的简单解决方案是这样的。

步骤1。

 git clone <your repos URL> .

您的项目在另一个文件夹中,然后:

第2步。

git reset --hard <the commit you wanna go to>

然后步骤 3。

在您的最新(和主要)项目目录(最后一次提交有问题的目录)中粘贴步骤 2 的文件

第4步。

git commit -m "Fixing the previous messy commit" 

步骤 5。

享受

于 2013-05-24T23:15:02.773 回答
3

正如其他人所说,通常你想使用hg backoutor git revert。然而,有时你真的想摆脱一个提交。

首先,您需要转到存储库的设置。点击Strip commits链接。

去除 bitbucket 设置中的提交链接

输入要销毁的变更集的变更集 ID,然后单击Preview strip。这会让你在做之前看到你将要造成什么样的伤害。然后只需单击Confirm,您的提交就不再是历史了。确保你告诉所有合作者你做了什么,这样他们就不会不小心把有问题的提交推回去。

于 2019-04-15T01:21:41.327 回答
1

您也可以为Dustin提到的 Bitbucket 编写命令:

git push -f origin HEAD^:master

注意:您可以使用任何分支代替 master。它删除只是推送 Bitbucket。

要在 git 中本地删除最后一次提交,请使用:

git reset --hard HEAD~1
于 2019-06-24T13:05:40.483 回答
0

一旦提交更改,它将无法删除。因为提交的基本性质是不删除。

您可以做的事情(简单安全的方法),

交互式变基:

1) git rebase -i HEAD~2 #将显示你最近的 2 次提交

2) 你的提交将像这样列出,最近将出现在页面底部 LILO(last in Last Out)

在此处输入图像描述

完全删除最后一个提交行

3) 通过ctrl+X或保存ESC:wq

现在您的分支将在没有您最后一次提交的情况下更新..

于 2017-10-24T07:50:43.407 回答
0

到目前为止,cloud bitbucket(我不确定哪个版本)允许从文件系统恢复提交,如下所示(我看不到如何从 Chrome 浏览器中的 Bitbucket 界面恢复)。

-备份您的整个目录以保护您无意中提交的更改

-选择签出目录

- 鼠标右键:乌龟 git 菜单

-repo-browser(菜单选项“revert”仅撤消未提交的更改)

- 按下 HEAD 按钮

-选择最上面一行(最后一次提交)

- 鼠标右键:通过此提交恢复更改

-在它撤消文件系统上的更改后,按提交

- 这会更新 GIT 并显示一条消息“恢复(您之前的消息)。这会恢复提交某某'

- 选择“提交并推送”。

于 2018-05-07T11:36:42.053 回答