【问题标题】:Git remove remote history past certain commitGit 删除特定提交后的远程历史记录
【发布时间】:2014-05-05 15:19:30
【问题描述】:

我有一个 Git/Gitlab 存储库。我们过去直接提交到 master,但我们决定在这个版本中像世界其他地方一样使用功能分支。

我们需要将远程主机重置为上次发布后的状态。如果有人已经直接提交给主服务器,我如何将其重置为干净状态,删除上次发布后的所有历史记录?

我现在用谷歌搜索了大约一个小时,但找不到这个特定问题的答案。对不起,如果它看起来多余,这似乎是一个没有明显答案的简单任务!

【问题讨论】:

标签: git gitlab


【解决方案1】:

要重置本地分支,

git branch -f master last-release

要重置远程分支,

git push -f origin last-release:master

其中last-release 是您要将master 重置为的引用(提交ID 或分支)。

(这些都不会影响您的工作树;如果您愿意,您甚至可以从一个裸仓库中执行这些操作。)

【讨论】:

  • 接受这个答案,可能是“正确”的方法
  • 当使用 GitLab 作为远程时,这不适用于 master 分支,也不适用于在 GitLab 中设置为存储库默认分支的任何其他分支。即使没有设置为默认分支,它也不适用于 master。使用 GitLab 7.9.0 测试。
  • @akaihola,这会改写(“丢失”)历史。通常,master 或其他重要分支将具有防止强制推送的保护。如果是这种情况,您将不得不更改权限,否则这是不可能的。
  • 在 GitLab 上,您可以临时“取消保护”主分支以允许这样做,因为它默认受到保护。它在您的项目设置(齿轮图标)上,然后是“受保护的分支”。 gitlab.com/help/user/project/protected_branches
【解决方案2】:

有时,你在 Stack Overflow 上发帖,一秒钟后你马上就明白了:

$ git reset --hard HEAD~9
$ git push --all --force

现在删除你的本地仓库,重新克隆。

【讨论】:

  • 小心!这将删除您一直在处理的任何本地提交,并将覆盖任何其他分支,而不仅仅是master。这可能是有效的,但要知道。
  • @Paul Draper:它不会删除任何东西。在一段时间内(默认情况下至少 2 周),所有内容仍会在 reflog 中可用。
  • 我在做任何事情之前克隆了一个单独的 repo 副本,以防我们搞砸了
  • @exabrial 当你只想重置master 分支时,你为什么要传递--all 标志?
  • @zerkms,你是对的。立即,它不会删除任何内容。 (希望如果有人确实犯了错误,他们会很快意识到这一点。)
猜你喜欢
  • 2014-11-20
  • 2013-09-20
  • 2012-04-06
  • 2012-04-04
  • 1970-01-01
  • 2014-02-21
  • 2015-07-24
  • 1970-01-01
  • 2016-12-07
相关资源
最近更新 更多