[英]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
替换pick
以skip
提交。 或者您可以用另一条指令替换“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 个提交压缩为 1,则可以跳过修改它们。如果您不需要历史记录来反映 10 个单独的编辑,如果您不关心历史是否只有一个包含所有组合更改的提交,那么这个是给你的票:
git reset HEAD~10
这会将当前分支的HEAD
移回 10 个提交。 您在这 10 次提交中所做的所有更改仍将在工作树中,但不再提交到 git 中。 您现在可以删除不需要的文件和git add .
剩下的,然后提交。 或者,如果您不想删除文件,只需将其保留在 git 之外,只需git add <the other 9 files>
并提交即可。
这是高级用户方式。 它更加自动化。 但我建议所有非 git-guru 使用上面的git rebase
,因为这是成为大师的好方法。
filter-branch的git 文档有从每次提交中删除文件的说明,所以只需遵循这些说明。
我从未使用过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.