从历史中删除提交的最佳方法?

时间:2017-12-11 21:42:32

标签: git github

我想从大约两年前从我的GitHub存储库中删除7/8提交。只有2/3的提交会触及任何代码,其余的只是添加和删除配置文件。

以前的一些开发人员按字面意思上传和删除了> 650个重复的配置文件,它搞砸了我们的github统计页面。 Stat Graph

我们尝试使用git rebase -i删除它们,但是花了6个小时,大部分代码都没了。

如何在不搞乱其他提交历史的情况下删除这些古老的提交? 我们当前正在重新编码存储库中的所有代码,因此如果不保留来自这些单独提交的更改,这不是什么大问题,但我们希望保留除此之外的旧代码的所有统计信息。

2 个答案:

答案 0 :(得分:0)

需要两个步骤:

  1. Rewrite git history,其中一个:
    • 从最后一个好的提交重新启动,丢弃所有混乱的提交:
  2.   

    git rebase --interactive good-commit-sha

    • 或filter-branch
      

    git filter-branch --tree-filter' rm -f config-files' HEAD

    1. 强行推送给主人:
    2.   

      git push --force origin master

      请注意,强烈建议不要使用推力,因为它会使您回购的所有当前克隆不一致。任何冲突都必须手动修复。

答案 1 :(得分:0)

  

强制性危险:重写项目历史是非常危险的!在尝试此操作之前,请确保您有备份,并且要格外小心!

要删除项目中的一个特定提交(例如,从多年前开始),您可以:

git rebase -p --onto SHA^ SHA

SHA是您要删除的提交。

这些选项的文档是:

-p, --preserve-merges
  Recreate merge commits instead of flattening the history by replaying
  commits a merge commit introduces. Merge conflict resolutions or
  manual amendments to merge commits are not preserved.

--onto <newbase>
  Starting point at which to create the new commits. If the --onto
  option is not specified, the starting point is <upstream>. May
  be any valid commit, and not just an existing branch name.

进行此更改后,您需要:

git push --force origin master
#        ^^^^^^^
#          !!!