【问题标题】:Remove history of a file from just a single branch, not the entire repo从单个分支中删除文件的历史记录,而不是整个 repo
【发布时间】:2014-04-05 09:09:55
【问题描述】:

我有一个主题分支(关闭master)有很多变化。在此主题分支的整个历史中,某个文件发生了许多更改。如何在我的主题分支的整个历史记录中删除对此文件的所有更改?

补充说明:

  • 请注意,该文件存在于主题分支创建之前。我不想删除文件本身。
  • 我有几个解决方案,但到目前为止它们似乎很乏味。我会将它们作为单独的答案发布。
  • git filter-branch 可以用于此目的吗?
  • 我的主题分支包含大约...比如说...60 次提交。

【问题讨论】:

  • 您想从历史记录中删除更改,还是可以,如果在合并到 master 时删除更改?
  • git filter-branch 绝对可以做到。您想要的是:对于每个新提交,如果该文件已被修改,请通过重新加载所需的版本来取消修改它。如果文件没有被修改,您仍然可以读取所需的版本,因为这将是一个空操作。我认为这可以通过--index-filtergit update-index 来完成。 (我自己必须尝试使其工作。)编辑:或者,是的,git checkout <rev> -- <path>,就像你自己的回答一样:-)
  • knittl:我想从历史记录中删除更改。
  • 附带说明,对于一个特性分支来说,60 次提交已经很多了。从开发流程的角度来看,您的功能范围可能太大。要么,要么你应该考虑在特性分支中压缩你的提交。
  • 纸杯蛋糕:确实。这是一个暑期实习生的结果,我们未能尽早与他们沟通。

标签: git


【解决方案1】:

使用git filter-branch

$ git checkout topic-branch
$ git filter-branch --index-filter 'git checkout master -- myfile' master..HEAD

【讨论】:

    【解决方案2】:

    根据分支的开头重新设置树的基础。使用属性来确定该特定文件的不同合并策略,特别是“merge.ours”(始终保留我们的文件)。这个帖子解释了如何:tell git to use ours merge strategy on specific files(问题本身告诉你如何去做,答案只是提问者的一个陷阱)。

    我不知道这有多“乏味”,例如,您是否必须在每次提交时确认某些内容,因为我还没有这样做。但我认为不会。

    【讨论】:

    • 我相信你会成功,但听起来有点复杂!
    【解决方案3】:

    做一个交互式变基。繁琐的版本是简单地编辑/修改每个提交以删除更改:

    git checkout topic-branch
    git rebase -i master    
    # set all commits to edit
    
    # for every commit; do
    git show --stat
    # if myfile is not changes: git rebase --continue
    
    # copy the commit message
    git reset HEAD^
    git reset myfile
    git checkout myfile
    git commit
    # paste in commit message
    
    git rebase --continue
    # ...until we are done
    

    稍微改进的版本是使用git log master.. myfile,并且只编辑列出的提交。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-10-19
      • 2014-11-25
      • 2012-12-05
      • 1970-01-01
      • 2015-01-18
      • 2023-01-22
      • 2013-02-05
      • 2016-03-13
      相关资源
      最近更新 更多