【问题标题】:Delete last commit in bitbucket删除 bitbucket 中的最后一次提交
【发布时间】:2013-01-28 00:05:57
【问题描述】:

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

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

【问题讨论】:

    标签: repository bitbucket


    【解决方案1】:

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

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

    开启git

    git revert <commit>
    

    mercurial:

    hg backout <REV>
    

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

    【讨论】:

    • 感谢您的信息。而且我知道如果我删除提交的后果,我只是不知道如何撤消我的操作,因为这是我第一次犯错。我需要撤消我的提交,因为系统已经上线。我们只有两个正在使用该存储库。
    • git backout &lt;REV&gt;?或者:hg backout &lt;REV&gt;?
    • 但是如果在要恢复的提交之后添加的提交对被删除的行进行了修改呢?
    • @RahulSaha 因为你所做的基本上是试图将提交合并到分支中,我很确定它会给你一个你必须解决的合并冲突。跨度>
    【解决方案2】:

    如果您与他人合作(或乐于给他们造成极大的烦恼),则可以从 bitbucket 分支中删除提交。

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

    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,您应该会看到所需的历史记录。您现在可以转到设置页面并将主分支更改回master

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

    编辑:显然你不需要像force-push a reset branch那样去github上的所有这些麻烦。

    与恼怒的合作者打交道

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

    git reset HEAD^
    git pull
    

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

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

    【讨论】:

    • 对于那些更喜欢使用 SourceTree 的人: 1) 要更改 Web UI 中 BitBucket 的主分支,请查看 Repo 设置。 2) 要删除 Web UI 中的分支,请查看“分支”页面。 3)按照上述重置本地回购。 4) 向上推送本地更改以重新创建这些分支。
    • 作为一个不小心推了一个秘密的人,我非常感谢这个答案的彻底性。谢谢!
    【解决方案3】:

    你可以重置为HEAD^然后强制推送。

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

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

    【讨论】:

    • Github 将允许这样做,但在撰写本文时,Bitbucket 不允许强制推送。
    • 实际上 bitbucket 确实支持强制推送,只是差异不是完全删除未跟踪的提交,而是将它们标记为已删除。
    • bitbucket 推荐的方法是使用还原。但我认为在我的情况下这更合适。因为我是唯一一个使用它的人,所以感觉比使用 revert 更干净。谢谢。
    • 是的,这仍然适用于 Bitbucket。你刚刚为我节省了很多时间!我从我的 Eclipse 进行了提交/推送,并与我拥有的其他项目混为一谈。部分原因是我使用命令行和内置 eclipse 处理 git 的不良做法。
    • 出色,或更简单:将当前分支重置为此提交,然后使用该强制推送到服务器修复我的问题
    【解决方案4】:

    这是一个最多 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>
    

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

    我已经成功使用过这种方法很多次了。需要团队合作才能确保一切同步。

    【讨论】:

      【解决方案5】:

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

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

      第 1 步。

       git clone <your repos URL> .
      

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

      第 2 步。

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

      那么 第 3 步。

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

      第四步。

      git commit -m "Fixing the previous messy commit" 
      

      第 5 步。

      享受

      【讨论】:

      • 剪切和粘贴真的很乱。另外,这并不能解决问题中的问题。
      • git revert 很简单:它创建一个新的提交,该提交与先前提交(或多个提交)中的更改相反。它不会删除提交,因此与此问题无关。另外,这里的克隆步骤也不是必须的。
      • Git revert 是和上面一样的机制。
      【解决方案6】:

      这个命令对我很有效!!

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

      运行此命令以恢复提交

      git revert [LastCommitID]
      

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

      我执行了这个命令

      git push --force origin master
      

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

      【讨论】:

        【解决方案7】:

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

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

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

        【讨论】:

        • 那是哪个版本,需要哪些权限?在我正在查看的 v6.4.3 上看起来有所不同,并且该项目不存在。我存储库管理员。
        【解决方案8】:

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

        git push -f origin HEAD^:master
        

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

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

        git reset --hard HEAD~1
        

        【讨论】:

          【解决方案9】:

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

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

          交互式变基:

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

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

          完全删除最后一个提交行

          3) 保存到ctrl+XESC:wq

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

          【讨论】:

            【解决方案10】:

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

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

            -选择签出目录

            -鼠标右键:乌龟git菜单

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

            -按下 HEAD 按钮

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

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

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

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

            -选择“提交并推送”。

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 1970-01-01
              • 2017-04-03
              • 2019-02-05
              • 2016-06-29
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多