Git remove remote history past certain commit
我有一个Git/Gitlab存储库。我们曾经直接提交给master,但是我们决定在这个版本中使用像世界其他地方一样的特性分支。
我们需要将远程主机重置为上次发布后的状态。如果有人已经直接提交给主控形状,那么如何将其重置为干净状态,删除上一个版本之前的所有历史记录?
我已经花了大约一个小时的时间在谷歌上,找不到这个特定问题的答案。对不起,如果它看起来是多余的,它看起来像一个简单的任务,没有明显的答案!
- 强制更新公共存储库通常是个坏主意。如果背后的原因只是一个策略更改,为什么不把主分支留在原处,让它在下一个版本中赶上呢?
- 在Git中可能重复了几个未推送到远程的提交,以及如何撤消最后一个Git提交?.
- @用户3426575公平问题…因为我们必须这么做。我们开始了一个相当大的版本,一些修复需要在大功能完成之前投入生产。如果我们已经做了特性分支开始,我们就可以减少一个额外的版本,并重新设置大特性的基。相反,我们必须回溯到最后一段已知的代码。
要重置本地分支,
1
| git branch -f master last-release |
要重置远程分支,
1
| git push -f origin last-release:master |
号
其中,last-release是要将master重置为的引用(commit id或branch)。
(这些都不会影响你的工作树;如果你愿意的话,你甚至可以从一个空的回购中进行这些操作。)
- 接受这个答案,可能是正确的方法
- 当将Gitlab用作远程时,这对主分支或任何其他在Gitlab中设置为存储库默认分支的分支都不起作用。即使没有设置为默认分支,它也不适用于master。使用Gitlab 7.9.0进行测试。
- @阿卡霍拉,这改写了("失去")的历史。通常情况下,主分支或其他重要分支将具有防止力推的保护。如果是这种情况,您必须更改权限,否则这是不可能的。
- 在Gitlab上,您可以-暂时-"取消保护"主分支以允许这样做,因为它在默认情况下是受保护的。它位于项目设置(COG图标)上,然后是"受保护的分支"。gitlab.com/help/user/project/protected_分支
有时,您会发布堆栈溢出,然后在一秒钟后立即计算出来:
1 2
| $ git reset --hard HEAD~9
$ git push --all --force |
现在删除本地repo,重新克隆。
- 小心!这将删除您正在处理的任何本地提交,并覆盖任何其他分支,而不仅仅是master。这可能是有效的,但要知道。
- @保罗·德雷珀:不会删除任何内容。在一段时间内(默认情况下至少2周),reflog中的所有内容仍然可用。
- 我在做任何事情之前克隆了一个repo的单独副本,以防我们搞砸了。
- @当您只想重置master分支时,为什么要传递--all标志?
- @纸杯蛋糕不知道。复制/粘贴错误
- @泽克斯,你说得对。它不会立即删除任何内容。(希望,如果有人确实犯了错误,他们会很快意识到。)