繁体   English   中英

我可以返回并从以前的 git 提交中删除特定文件吗?

[英]Can I go back and remove particular files from previous git commits?

我的项目中有 5 个文件。 我已经完成了 10 次提交,在每次提交中,我修改并暂存了每个文件。 是否可以更改每个提交以包含这 5 个文件中的第一个之外的所有文件?

是的,这是不可能的。 我会给你四种重写历史记录的方法,以从中删除文件......

⚠️ 如果出于安全原因需要从 git 历史记录中删除文件,则应按照从 Git 历史记录删除敏感文件及其提交中的步骤操作。

交互式变基

如果您还不是 git pro,我建议您使用此方法,即使有更多手动步骤。

既然你想重写 10 个提交,你可以这样做:

git rebase -i HEAD~10

这将打开一个“待办事项列表”,它将列出从HEAD~10开始的提交,这将是最后 10 次提交。 如果您保留文件并关闭它, git rebase将按照显示的顺序重放这 10 次提交,并且不会有任何更改。 但是通过编辑待办事项列表,您可以完全控制发生的事情。 您可以重新排序任何行,从而重新排序提交。 您可以删除一行或用skip替换pickskip提交。 或者您可以用另一条指令替换“pick”。 所有这些都在 todo 文件本身中进行了解释,因此您不必记住所有选项。

在您的情况下,您希望修改每个提交以删除一个文件。 edit或只是e替换每个pick 关闭文件。 Git rebase 然后会重放这些提交,但会在每次提交后停止并允许您修改它。

在第一个上,您将git rm要删除的文件,然后git commit --amend 新的第一次提交将不再包含该文件。 您现在可以继续下一个。

ℹ️ 在交互式 rebase 期间,您始终可以输入git status ,它会向您显示 rebase 的当前状态,并提示您下一步可能想要做什么。

继续下一次提交: git rebase --continue Rebase 将尝试重放下一次提交,但会因冲突而停止:在您的新重写分支上,该文件不再存在,但在正在重放的第二次提交中,该文件已被修改。

在这种情况下,您只需再次删除文件然后git add .解决冲突git add . 使用此选择的冲突解决方法更新暂存索引。 然后git rebase --continue告诉 rebase 重试提交第二次提交,然后继续进行第三次提交。

ℹ️ 如果在任何时候您认为自己犯了错误,或者改变了主意,请运行git rebase --abort ,一切都会恢复到您之前的状态。

对于所有剩余的提交,相同的冲突将再次发生,并且您对所有提交都执行相同的操作:

  • 删除文件
  • git add . 记录你的决心
  • git rebase --continue继续前进。

当 rebase 完成后,您当前的分支HEAD现在将指向一个新的 10 个提交系列,而没有您想要删除的文件。 原始提交仍然存在,但如果没有引用指向它们,它们最终将从 git 数据库中删除。

将 10 个提交压缩为一个没有文件的提交

如果您将 10 个提交压缩为 1,则可以跳过修改它们。如果您不需要历史记录来反映 10 个单独的编辑,如果您不关心历史是否只有一个包含所有组合更改的提交,那么这个是给你的票:

git reset HEAD~10

这会将当前分支的HEAD移回 10 个提交。 您在这 10 次提交中所做的所有更改仍将在工作树中,但不再提交到 git 中。 您现在可以删除不需要的文件和git add . 剩下的,然后提交。 或者,如果您不想删除文件,只需将其保留在 git 之外,只需git add <the other 9 files>并提交即可。

git 过滤器分支

这是高级用户方式。 它更加自动化。 但我建议所有非 git-guru 使用上面的git rebase ,因为这是成为大师的好方法。

filter-branchgit 文档有从每次提交中删除文件的说明,所以只需遵循这些说明。

git-filter-repo

我从未使用过git-filter-repo (还),但它非常推荐(显然是 git 维护者)。 它本质上是一个对用户更友好的git filter-branch版本。 @LeGEC 在评论中提供了特定的命令,所以我在这里添加它:

git filter-repo --invert-paths --path file/to/ignore

祝你好运!

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM