删除bitbucket中的最后一次提交


103

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

如何删除我的上一次提交?或如何解决?

Answers:


102

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

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

git上

git revert <commit>

关于水银

hg backout <REV>

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


感谢您的信息。而且我知道删除提交的后果,我只是不知道如何撤消操作,因为这是我第一次犯错。我需要撤消我的提交,因为系统已经处于运行状态。我们只有两个正在使用该存储库。
catherine

git backout <REV>?或者:hg backout <REV>
ArmandoPérezMarqués2013年

但是,如果要还原的提交之后添加的提交在要删除的行上进行了修改,该怎么办?
拉斯

@RahulSaha,因为您所做的基本上是尝试将提交合并到分支中,所以我敢肯定,它将给您带来必须解决的合并冲突。
asermax

98

如果您与他人合作(或很乐意引起他人的极大烦恼),则可以从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

如果您要更改master分支

通常,在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上进行所有麻烦工作,因为您可以强制按下reset分支

与恼人的合作者打交道

下次任何人尝试从您的存储库中提取(如果他们已经提取了错误的提交),则提取将失败。他们将不得不手动更改为更改历史记录之前的提交,然后再次拉出。

git reset HEAD^
git pull

如果他们已经撤消了错误的提交,在错误的提交之上进行了提交,那么他们将必须重置,然后再git cherry-pick创建他们想要创建的良好的提交,从而有效地重新创建整个分支而没有错误的提交。

如果他们从未取消过错误的提交,那么整个过程将不会影响他们,并且他们可以像往常一样进行拖动。


1
对于那些更喜欢使用SourceTree的用户:1)要在Web UI中更改BitBucket的主分支,请查看“回购设置”。2)要在Web UI中删除分支,请查看“分支”页面。3)按照上述方法重置本地存储库。4)向上推送本地更改以重新创建这些分支。
理查德·勒·马修里尔

2
作为一个不小心泄露秘密的人,我非常感谢这个答案的彻底。谢谢!
扭矩

48

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

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

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


Github将允许这样做,但是在撰写本文时,Bitbucket不允许强行推送。
JamesQMurphy

4
实际上bitbucket确实支持强制差异,而不是完全删除未跟踪的提交,它将其标记为已删除。
Shubanker

从bitbucket推荐的方法是使用还原。但是我认为这是更合适的。由于我是唯一使用它的人,因此感觉比使用revert更干净。谢谢。
nafsaka 2015年

1
是的,这仍然适用于Bitbucket。您刚刚为我节省了很多时间!我从Eclipse进行了一次提交/推送,然后将其混合到我拥有的其他项目中。部分原因是由于我同时使用命令行和内置eclipse来处理git的错误做法。
DarkCygnus

精妙或更容易:将当前分支重置为该提交,然后使用强制推
送来

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

请享用


1
剪切和粘贴确实很麻烦。另外,这不能解决问题。

1
git revert很简单:它创建一个新的提交,该提交与上一个提交(或多个提交)中的更改相反。它不会删除提交,因此与该问题无关。另外,这里的克隆步骤并不是必需的。
naught101 '09

1
Git恢复是与上述相同的机制。
nafsaka 2015年

3

这是多达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>

为此,进行尽可能多的提交。

我已经成功地多次使用了这种方法。需要团队共同努力,以确保一切都同步。


2

正如其他人所说,通常您想使用hg backoutgit revert。但是,有时您确实希望摆脱提交。

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

剥离提交位桶设置中的链接

输入要销毁的变更集的变更集ID,然后单击Preview strip。这样一来,您就可以在执行操作之前先了解自己将要遭受的损害。然后,只需单击Confirm,您的提交不再是历史记录。确保告诉所有协作者您做了什么,这样他们才不会意外地将令人讨厌的提交推回去。


那是哪个版本,并且需要哪些权限?我正在查看的v6.4.3上看起来有所不同,但该项目不存在。我存储库管理员。
拉斐尔

1

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

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

交互式变基:

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

2)您的提交将显示为,最近的列表将显示在LILO页面的底部(后进后出)

在此处输入图片说明

完全删除最后一个提交行

3)用ctrl+X或保存ESC:wq

现在,您的分支将更新,而无需您上一次提交。


1

您也可以如Dustin所述为Bitbucket编写命令:

git push -f origin HEAD^:master

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

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

git reset --hard HEAD~1

0

到目前为止,云bitbucket(我不确定是哪个版本)允许按如下方式从文件系统还原提交(我看不到如何从Chrome浏览器的Bitbucket界面还原)。

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

-选择签出目录

-右键:乌龟git菜单

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

-按HEAD按钮

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

-鼠标右键:通过此提交还原更改

-撤消文件系统上的更改后,按确认

-这会用一条消息“还原(更新您以前的消息)来更新GIT。这样可以还原提交。

-选择“提交并推送”。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.