我见过许多相关的讨论,但并不能解决我的特定问题。我想删除历史记录中特定文件的一个步骤。
例如,我添加了一个文件" Foo.txt"。我承诺改变。然后我修改了一堆文件。我再犯一次。现在,我想恢复" Foo.txt"到之前的提交,也删除了更改的历史记录。
我知道命令
git checkout "aasdfasdfad" Foo.txt
会将Foo.txt的状态恢复为提交时的状态" aasdfasdfad"。但是,git仍然有以前版本的" Foo.txt"在某种程度上,在它的状态。我怎么知道的?因为在我的情况下," Foo.txt"从几个字节变为兆字节。因此,当我恢复到早期版本时,我的.git目录的大小应减少大约一兆字节,但它不会改变。
不知怎的,我不得不告诉git我不仅要恢复到早期版本的Foo.txt,而且我想从那时起丢弃对Foo.txt的所有更改。
[稍后补充] 为了清楚地表明我想要做的事情,让我展示一个非常具体的场景:
此时,我想将foo.txt重置为它在步骤3之后所处的状态。但我希望bar.txt具有它在步骤8之后所处的状态。所以我想要文件和历史看起来好像我从未做过第6步和第7步
答案 0 :(得分:0)
首先,我假设您知道重写git历史记录的危险 - 简而言之,如果您已经将违规提交推送到服务器并且其他人正在工作,那么您不想这样做关于这个项目。
话虽如此,您仍然希望执行以下操作。按照您的意愿制作foo.txt的副本(即aasdfasdfad
中的内容)。然后做一个git rebase -I aasdfasdfad
。这将为您的编辑器提供一个提交列表。对于修改了foo.txt的每一个,从" pick"更改其操作。到"编辑"。保存并关闭编辑器。现在,每当git暂停rebase以允许您编辑提交时,请复制" good" foo.txt的版本进入你的工作目录(即覆盖那个git"知道" about)。然后git commit --amend
,git rebase --continue
,并重复直到rebase完成。
请注意,在垃圾回收之前,您的.git目录可能会非常大。