【问题标题】:How can I remove a commit on GitHub? [duplicate]如何删除 GitHub 上的提交? [复制]
【发布时间】:2020-06-26 22:54:04
【问题描述】:

我“不小心”将提交推送到 GitHub。

是否可以删除此提交?

我想将我的 GitHub 存储库恢复到本次提交之前的状态。

【问题讨论】:

  • 注意事项:当你有很多人关注你的仓库时,千万不要这样做,如果他们拉进来,你会使他们的本地仓库不同步最新的变化。如果这涉及到错误,您可以再次提交以撤消错误。如果这涉及密码,您可能需要更改密码,不要急于删除它。 强迫事情并非没有缺点。
  • 注意事项 2: 仍然可以通过 SHA1 直接访问提交。强制推送不会删除提交,它会创建一个新提交并将文件指针移动到它。要真正删除提交,您必须删除整个 repo。
  • 谢谢,WOC2 帮助我从错误删除中恢复了我宝贵的代码!谢谢!
  • @Gustav "...你必须删除整个 repo。" - 或者只是强制垃圾收集开始。

标签: git github git-commit


【解决方案1】:

注意:请在下面的 cmets 中查看 git rebase -i 的替代方案—

git reset --soft HEAD^

首先,删除本地存储库中的提交。您可以使用git rebase -i 执行此操作。例如,如果这是您的最后一次提交,您可以执行 git rebase -i HEAD~2 并删除弹出的编辑器窗口中的第二行。

然后,使用git push origin +branchName --force强制推送到GitHub

请参阅Git Magic Chapter 5: Lessons of History - And Then Some 了解更多信息(即,如果您想删除较旧的提交)。

哦,如果您的工作树很脏,您必须先执行git stash,然后再执行git stash apply

【讨论】:

  • 更准确地说,你 / 必须 / 藏起来,因为 git rebase - 如果你有一棵脏树,我不会让你。
  • 请注意,这仍会将提交留在 reflog 中。如果您在其中有敏感数据,则可能必须完全删除该存储库。
  • 我很困惑。为什么不能使用git reset --soft HEAD^ 取消提交然后执行git push origin +master?为什么我们在这种情况下使用git rebase -i HEAD^^
  • @Dennis 因为我在 3.5 年前不熟悉 reset --soft。 =)
  • 大家小心。请参阅下面的 subutux 评论。即使在强制推送到 GitHub 之后,GH 仍然会缓存您的提交。来自help.github.com/articles/remove-sensitive-data :“危险:一旦提交被推送,您应该认为数据已被泄露。如果您提交了密码,请更改它!如果您提交了密钥,请生成一个新的。”
【解决方案2】:
git push -f origin HEAD^:master

这应该“撤消”推送。

【讨论】:

  • 这也很好用!它从 github 中删除了推送,但保留了我的本地存储库。谢谢!
  • 嗯,是的。它只做你要求的。 :) 您的存储库和远程存储库不必具有匹配的引用。
  • 但是请注意,这只会移动分支指针。意外推送的提交仍然存在于远程仓库中。在 GitHub 的情况下,这意味着如果您知道 SHA-1 哈希(例如,来自用户活动历史记录),仍然可以看到它。
  • do: git push -f origin HEAD^^:master 来反转最后的 2 个更改,工作 n 次
  • @ianj 请注意,带有 n ^ 的 HEAD 可以替换为 HEAD~n,例如HEAD~3 而不是 HEAD^^^.
【解决方案3】:

如果只是一个错误,可以轻松恢复(也许你分叉了一个 repo,然后最终推送到原始而不是新的),这是另一种可能性:

git reset --hard 71c27777543ccfcb0376dcdd8f6777df055ef479

显然,将该数字换成您要返回的提交的编号。

一旦您再次推送,此后的所有内容都将被删除。为此,下一步将是:

git push --force

【讨论】:

  • 警告:这会重写你的历史,你会丢失提交,并且在协作环境中通常不是一件好事。
  • 是的,这对我来说是最简单和最好的。我的 dev 分支需要被还原,然后我才能为其他东西发送 PR。一开始我应该把我的更改放在一个分支中。
  • 这适用于未受保护的分支。如果 Github 分支被保护,强制推送会失败。
  • 或者:|| git reset --hard HEAD^1 || (1 是最后一次提交)
  • 由于我无法编辑,所以我添加了另一条评论,以防有人像我一样不假思索地做了这个愚蠢的事情,你可以返回一个“git reflog”然后一个“git reset - -hard xxx" 其中 xxx 是您在意外重置之前所做的最后一次提交...
【解决方案4】:
  1. git log 找出你想要恢复的提交

  2. git push origin +7f6d03:master 而 7f6d03 是错误推送提交之前的提交。 + 用于 force push

就是这样。

Here 是一个很好的指南,可以解决您的问题,简单易行!

【讨论】:

  • 我推荐该指南,在这方面非常有帮助。
  • 最佳答案!怎么回事这么清楚
  • 这适用于我从分支中删除一些最新发布的提交。
  • 在试图找出为什么这个命令不起作用之后,你清楚地指出在这里插入最后一个理想的提交。我正在尝试进行第一次提交,这就是为什么我收到消息它已经是最新的。
  • 这应该是公认的答案,因为问题没有指定要删除哪个提交。接受的答案仅删除 last 提交。这个答案会删除 any 提交。
【解决方案5】:

如果您希望在删除后保留提交更改:

请注意,如果要删除的提交是最后提交的,则此解决方案有效。


1 - 从日志中复制您想要返回的提交参考:

git log

2 - 将 git 重置为提交参考:

 git reset <commit_ref>

3 - 存储/存储来自错误提交的本地更改,以便在推送到远程后使用:

 git stash

4 - 将更改推送到远程存储库,(-f 或 --force):

git push -f

5 - 将存储的更改取回本地存储库:

git stash apply

7 - 如果您在更改中有未跟踪/新文件,您需要在提交之前将它们添加到 git:

git add .

6 - 添加您需要的任何额外更改,然后提交所需的文件,(或使用点“.”而不是说明每个文件名,以提交本地存储库中的所有文件:

git commit -m "<new_commit_message>" <file1> <file2> ...

git commit -m "<new_commit_message>" .

【讨论】:

  • 谢谢!我很高兴将它恢复到 5。然后我可以在 github 桌面中进行更改。
  • 这正是我想做的,而且效果很好!
  • 这是问题的最佳答案!
  • 你刚刚救了我的命 :)
【解决方案6】:

您需要清除缓存才能将其彻底清除。 这个来自 git 的帮助页面会帮助你。 (它帮助了我) http://help.github.com/remove-sensitive-data/

【讨论】:

  • +1:从您的分支中删除提交时,如果您知道 URL/SHA-1,它仍然可以在 GitHub 上使用。从缓存中删除提交的唯一方法是联系 GH 支持(请参阅该链接中的“Github 上的缓存数据”部分
  • 我确实想指出,实际解释页面上的内容并引用相关部分可能是一个更好的主意。来自help guide,它说:“鼓励链接到外部资源,但请在链接周围添加上下文,以便您的其他用户了解它是什么以及为什么存在。始终引用重要链接中最相关的部分,以防目标站点无法访问或永久脱机。”经验法则:假装链接不存在,或者他们无法点击。
  • 清除缓存还有另一种方法:删除仓库,然后重新创建并推送。虽然这对每个人来说都不是可能的,但对许多人来说,这比联系 Github 支持更容易和更快(也许你不想指向你推送敏感数据的第三方 [Github])。
【解决方案7】:

删除最近的提交,保留你已经完成的工作:

git reset --soft HEAD~1

删除最近的提交,破坏你所做的工作:

git reset --hard HEAD~1

【讨论】:

  • 之后的push呢?
【解决方案8】:
1. git reset HEAD^ --hard
2. git push origin -f

这对我有用。

【讨论】:

  • 当提交已经被推送到 GitHub 时说“一切都是最新的”...
  • 如果提交 A 是第一个,B 是第二个。您要重置哪个提交?
  • A 是最新的,我想回到 B。
  • git reset B --hard 然后git push origin -f
  • 当我想从我正在处理的分支中删除提交时,这对我来说效果最好。
【解决方案9】:

使用git revert 恢复您的推送。

git-revert - 恢复一些现有的提交

git revert [--edit | --no-edit] [-n] [-m parent-number] [-s] <commit>...
git revert --continue
git revert --quit
git revert --abort

还原相关补丁引入的更改,并记录一些记录它们的新提交。这要求您的工作树是干净的(不修改 HEAD 提交)。

注意git revert用于记录一些新的提交,以逆转一些较早的提交的影响(通常只是一个错误的提交)。如果您想丢弃工作目录中所有未提交的更改,您应该看到 git-reset,尤其是 --hard 选项。

【讨论】:

  • 这是避免破坏他人克隆的推荐方法。它创建一个新的提交来撤消先前的提交。但是它没有回答从“历史”中删除提交的问题。
  • 许多其他答案都很好,但如果您不能强制推送到 master,这似乎是唯一可行的方法。
  • 示例用法会有所帮助,比从手册页粘贴更好。帮助人们浏览[] 的东西。
【解决方案10】:

从远程存储库中删除提交:

 git push -f origin last_known_good_commit:branch_name

为了从本地存储库中删除提交:

git reset --hard HEAD~1

link

【讨论】:

    【解决方案11】:

    您需要从要恢复到的提交中知道您的提交哈希。您可以从 GitHub URL 获取它,例如:https://github.com/your-organization/your-project/commits/master

    假设来自提交的哈希(您要返回的位置)是“99fb454”(长版本“99fb45413eb9ca4b3063e07b40402b136a8cf264”),那么您所要做的就是:

    git reset --hard 99fb45413eb9ca4b3063e07b40402b136a8cf264
    git push --force
    

    【讨论】:

    • 恕我直言,这是这里最好的答案
    • 同意,就像一个魅力。这是一个被严重低估的答案。
    【解决方案12】:

    在 Github 上找到您希望成为分支负责人的提交的 ref 规范并使用以下命令:

    git push origin +[ref]:[branchName]

    在您的情况下,如果您只想返回一个提交,请找到该提交的 ref 的开头,例如它是 7f6d03,以及您要更改的分支的名称,例如它是掌握,然后执行以下操作:

    git push origin +7f6d03:master

    加号被解释为--force,因为您正在重写历史记录,所以这是必需的。

    请注意,任何时候您 --force 提交时,您都可能会重写合并您分支的其他人的历史记录。但是,如果您快速发现问题(在其他人合并您的分支之前),您将不会遇到任何问题。

    【讨论】:

      【解决方案13】:

      如果您这样做是因为您在提交中包含敏感数据,那么在此处使用其他答案是不安全的(subutux 除外,我将对此进行扩展)。

      github guide on this 建议使用外部工具,但我更喜欢使用内置工具。

      首先,备份您的存储库。那么:

      git filter-branch --force --index-filter \
      'git rm --cached --ignore-unmatch PATH-TO-YOUR-FILE-WITH-SENSITIVE-DATA' \
      --prune-empty --tag-name-filter cat -- --all
      

      在此之后,确保存储库处于您想要的状态。您可能想要对备份进行比较。

      如果你确定它是正确的,那么:

      #get rid of old unreferenced commits (including the data you want to remove)
      git gc --prune=now
      git push origin --force --all
      

      您可能希望将本地备份保留一段时间,以防万一。

      【讨论】:

      【解决方案14】:

      在您的终端上运行此命令。

      git reset HEAD~n
      

      您可以从本地 repo 中删除最后 n 个提交,例如头~2。 继续在您的存储库上强制 git push。

      git push -f origin <branch>
      

      希望这会有所帮助!

      【讨论】:

        【解决方案15】:

        为了保留分支和合并结构,在执行 rebase 时使用 --preserve-merges 选项很重要:

        git rebase --preserve-merges -i HEAD^^
        

        【讨论】:

        【解决方案16】:

        对于 GitHub

        • 在本地存储库中重置提交 (HARD)
        • 创建一个新分支
        • 推送新分支
        • 删除旧分支(如果要删除主分支,则新建一个作为默认分支)

        【讨论】:

          【解决方案17】:

          首先将本地更改保存在旁边的某个地方(备份)

          您可以浏览您最近的提交,然后通过单击选择提交哈希 “复制完整的 SHA”按钮将其发送到剪贴板。

          如果您的最后一次提交哈希是 g0834hg304gh3084gh(例如)

          你必须跑:

          git push origin +g0834hg304gh3084gh:master

          使用您之前复制的哈希使其成为“HEAD”修订版。

          添加所需的本地更改。完成;)

          【讨论】:

            【解决方案18】:

            如果你想删除 do interactive rebase,

            git rebase -i HEAD~4

            4 represents total number of commits to display count your commit and相应更改

            并从列表中删除您想要的提交...

            通过 Ctrl+X(ubuntu):wq(centos)

            保存更改

            第二种方法,做还原,

            git revert 29f4a2 #your commit ID
            

            这将恢复特定的提交

            【讨论】:

              【解决方案19】:

              GitHub Desktop 中,您只需右键单击提交并还原它,这将创建一个撤消更改的新提交。

              意外提交仍将保留在您的历史记录中(例如,如果您意外提交了 API 密钥或密码,这可能会成为问题),但代码将被还原。

              这是最简单最容易的选择,接受的答案更全面。

              【讨论】:

              • 我已经看到这会导致 git flow 出现问题。例如,您不小心将 develop 合并到 master 中以获取尚未发布的功能。如果您只是恢复该合并,那么当您将 master 合并到 development 时,它将从那里删除该功能。
              【解决方案20】:

              重写历史不太好。如果我们使用git revert &lt;commit_id&gt;,它会创建一个干净的反向提交所述提交ID。

              这样,历史不会被重写,而是每个人都知道有一个还原。

              【讨论】:

              • This older answer 已经告诉用户git revert
              • 那不符合这个要求:“我想把我的 GitHub 存储库还原成这次提交之前的样子”
              【解决方案21】:

              添加/删除文件以获得所需的内容:

              git rm classdir
              git add sourcedir
              

              然后修改提交:

              git commit --amend
              

              之前的错误提交将被编辑以反映新的索引状态 - 换句话说,就像你一开始就没有犯过错误

              请注意,只有在尚未推送时才应该这样做。如果您已推送,那么您只需正常提交修复即可。

              【讨论】:

              • 这将创建一个额外的修订......没有任何变化
              猜你喜欢
              • 2014-07-07
              • 2012-11-22
              • 2012-06-04
              • 2018-11-28
              • 2015-07-18
              • 2016-11-19
              • 2011-10-26
              • 2014-05-11
              相关资源
              最近更新 更多