Git删除文件历史记录中的一步

时间:2015-06-24 17:44:01

标签: git history git-checkout

我见过许多相关的讨论,但并不能解决我的特定问题。我想删除历史记录中特定文件的一个步骤。

例如,我添加了一个文件" Foo.txt"。我承诺改变。然后我修改了一堆文件。我再犯一次。现在,我想恢复" Foo.txt"到之前的提交,也删除了更改的历史记录。

我知道命令

git checkout "aasdfasdfad" Foo.txt

会将Foo.txt的状态恢复为提交时的状态" aasdfasdfad"。但是,git仍然有以前版本的" Foo.txt"在某种程度上,在它的状态。我怎么知道的?因为在我的情况下," Foo.txt"从几个字节变为兆字节。因此,当我恢复到早期版本时,我的.git目录的大小应减少大约一兆字节,但它不会改变。

不知怎的,我不得不告诉git我不仅要恢复到早期版本的Foo.txt,而且我想从那时起丢弃对Foo.txt的所有更改。

[稍后补充] 为了清楚地表明我想要做的事情,让我展示一个非常具体的场景:

  1. [创建文件foo.txt。现在,它的大小是1KB。]
  2. git add foo.txt
  3. [create file bar.txt]
  4. git add bar.txt
  5. git commit -m" small file"
  6. [修改foo.txt。现在它的大小为1GB。]
  7. git add foo.txt
  8. [modify bar.txt]
  9. git add bar.txt
  10. git commit -m" huge file"
  11. 此时,我想将foo.txt重置为它在步骤3之后所处的状态。但我希望bar.txt具有它在步骤8之后所处的状态。所以我想要文件和历史看起来好像我从未做过第6步和第7步

1 个答案:

答案 0 :(得分:0)

首先,我假设您知道重写git历史记录的危险 - 简而言之,如果您已经将违规提交推送到服务器并且其他人正在工作,那么您不想这样做关于这个项目。

话虽如此,您仍然希望执行以下操作。按照您的意愿制作foo.txt的副本(即aasdfasdfad中的内容)。然后做一个git rebase -I aasdfasdfad。这将为您的编辑器提供一个提交列表。对于修改了foo.txt的每一个,从" pick"更改其操作。到"编辑"。保存并关闭编辑器。现在,每当git暂停rebase以允许您编辑提交时,请复制" good" foo.txt的版本进入你的工作目录(即覆盖那个git"知道" about)。然后git commit --amendgit rebase --continue,并重复直到rebase完成。

请注意,在垃圾回收之前,您的.git目录可能会非常大。