从旧提交中删除已在本地删除的提交文件

时间:2021-03-03 13:07:06

标签: git github

我在提交 A001 中偶然提交了一些文件。这些文件非常大(每个大约 100MB)。在注意到我的错误后,在下一次提交中,我使用 rm 命令删除了这些文件,并将这些更改提交到提交 A002。我认为这解决了我的问题并继续开发。几次提交后,假设提交 A005 我已经尝试将所有内容推送到远程(大文件已被删除,但它们仍在提交 A001 中提交),推送失败并显示以下消息:< /p>

remote: error: GH001: Large files detected. You may want to try Git Large File Storage - https://git-lfs.github.com.
...
...

 ! [remote rejected] melodic-dev -> melodic-dev (pre-receive hook declined)

没关系,因为提交 A001 中仍然存在大文件。

我该怎么做:

  • 返回提交A001,取消暂存那些大文件并重新创建提交A001,而没有删除那些大文件,同样提交A002
  • 重新创建所有后续提交 A003-A005,因为它们处于重新创建的 A001_edited-A002_edited 提交的尖端,没有那些大文件
  • 将更正后的 A001-A005 提交推送到远程分支

我需要类似的东西:创建包含所有提交 NEW_BRANCH:A001-A005 的新分支。在那个分支中,我想从提交 A001 中删除一些文件,因此我有 NEW_BRANCH: A001_edited 提交,我想将 OLD_BRANCH:A001-A002-A003-A004-A005NEW_BRANCH: A001_edited-A002_edited 合并,以便我有以下内容:OLD_BRANCH: A001_edited-A002_edited-A003-A004-A005

A001_edited = A001 不提交(还原 git add Large files)那些大文件 A002_edited = A002 不删除(还原 git rm Large files)那些大文件

在历史某个地方的连续两次提交中,我想删除一些暂存/未暂存文件并保持其他所有内容相同。

我尝试了一些东西,但没有成功。 我希望我已经足够澄清我的问题,如果没有让我知道:)

感谢您的时间和帮助。

2 个答案:

答案 0 :(得分:1)

这可以通过一种称为变基的强大而可怕的方法来解决! :) 这是一种方法:

  1. 运行git rebase -i --root。这将打开一个编辑器,列出从 A001 到最新提交的所有提交。
  2. 在该文件中,将 A001 前面的“pick”一词更改为“edit”。保存文件并关闭编辑器。
  3. Git 会让你回到你创建 A001 之后的那一刻(你错误地添加了大文件)。运行 git rm --cached bigfile1 bigfile2 以将它们从索引中删除,然后运行 ​​git commit --amend 以修复提交 A001 以不包含它们。
  4. 运行git rebase --continue。这将在您更改的提交之上重新应用所有提交。 A002 现在应该只包含您所做的更改而不是删除文件。任何提交都不应再包含大文件。

希望对您有用,如果您遇到任何问题,请告诉我!

答案 1 :(得分:1)

我已经按照 blinry 的建议使用了 rebase,但没有使用 git rm --cached bigfile1 bigfile2

如果我还没有这样做,我会使用 git rm --cached bigfile1 bigfile2 A002 提交。

为了澄清,我无意中将一些大文件添加到 A001 和 在提交 A002 中删除了它们,这使我无法推送远程分支。我只是使用了交互式变基并将提交 A002 压缩到 A001 中: 如下:

pick A005 
pick A004 
pick A003
squash A002
pick A001

Squash 命令“合并”选择的提交与前一个提交,在这种情况下,它“合并”删除大文件,添加大文件和一些代码更改,这导致了想要的代码更改而没有大文件,并清理 git 历史记录 (Everything before A001 - A001_without_big_files -A003-A004-A005)

感谢您的帮助:)