0

我有 6 个提交,每个提交都有多个文件。我的“问题”是,我提交了一个我不应该提交的文件,我希望它从那个旧提交中消失,所以我看不到它:

last commit
  file8
  file7

commit 3
  file6
  file5

commit 2
  file4
  file3

first commit
  file2
  file1

如何从提交 2 中删除 file4 以使其消失?

...
commit 3
  file6
  file5

commit 2
  file3

...
4

2 回答 2

0

您可以使用以下命令进行此操作。但首先要找出存储库中要删除的文件的路径 ( file4)。

git filter-branch --index-filter "git rm -rf --cached --ignore-unmatch <path_to_file>" HEAD

在此之后,执行git push -f并将文件commit2从存储库中删除。

但要小心 git filter-branch。你可以在这里看到的文档

于 2021-07-14T09:35:08.430 回答
0

你不能。 任何提交,一旦做出,就永远无法改变。所以你不能从旧的提交中删除文件。

这并不意味着您无法解决真正的问题,即:您仍然希望有六个提交,但是您希望这六个提交中的一些内容与现在不同。您可以通过进行几次的提交来实现这一点,然后停止使用一些旧的提交。

如果提交 #1 没问题,您可以保持原样。但是,在 #1 之后的提交 #2 是不行的。你必须把那个扔掉。您实际上不能直接丢弃或删除它,但您可以停止使用它。一旦你这样做了,Git 最终会丢弃它。1 但是,您将需要一个新的改进版本的 commit #2,您将使用它来代替旧的 commit-#2。

提交 #3 可能部分没问题,如果它不包含您不希望任何提交包含的文件。2 但是即使这样可以,毕竟也肯定不行,因为它的是 bad commit #2。每个 Git 提交都引用其直接前任,因此要替换提交 #2,您还必须删除提交 #3。这意味着您需要更换#3。

提交 #4 可能部分正常,就像 #3 一样,但像 #3 一样,它指的是错误的提交:在这种情况下,是 #3 本身!#3 不好,因为它直接引用 #2,这也使得 #4 不好。所以你将不得不制作一个新的改进版本的提交 #4。

这与提交 #5 和 #6 重复。如果提交 #2 不好,您必须用新的和改进的版本替换它,这也需要替换每个后续提交。

那么:你如何替换这些提交?这就是它的git rebase用武之地。git rebase它的全部意义在于接受一些现有的提交,这些提交在某种程度上基本上是可以的,但在其他方面就不行了——并用新的和改进的提交替换它们.

git rebase命令在git cherry-pick内部执行此操作。了解这一点并知道它是如何工作的是个好主意。不过其他 StackOverflow 帖子已经很好地介绍了这一点,所以请参阅那些


1默认情况下,废弃的提交至少会保留 30 天,以防您改变主意并希望它们回来。一旦它们变成这样就很难找到它们,而且几乎不值得尝试加快 Git 对它们所做的默认至少 30 天老化的事情,但如果你遇到奇怪的情况,可以加快进程。

2每个提交都包含每个文件,而不仅仅是自上次提交以来更改的文件。因此,如果提交 #3 没有删除文件,与提交 #2 相比,它毕竟是不行的。但这是一个侧面,因为我们将构建新的和改进的提交的方式。

于 2021-07-14T08:17:04.953 回答