仅从一个分支中删除文件的历史记录,而不是整个仓库

时间:2013-09-25 09:02:04

标签: git

我有一个主题分支(关master)有很多变化。在本主题分支的历史中,对某个文件进行了大量更改。如何在我的主题分支的历史记录中删除对此文件的所有更改?

附加说明:

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

3 个答案:

答案 0 :(得分:4)

使用git filter-branch

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

答案 1 :(得分:0)

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

我不知道这是多么“乏味”,例如你是否必须在每次提交时确认一些事情,因为我还没有这样做。但我想不会。

答案 2 :(得分:0)

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

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并仅编辑列出的提交。