你不能。 任何提交,一旦做出,就永远无法改变。所以你不能从旧的提交中删除文件。
这并不意味着您无法解决真正的问题,即:您仍然希望有六个提交,但是您希望这六个提交中的一些内容与现在不同。您可以通过进行几次新的提交来实现这一点,然后停止使用一些旧的提交。
如果提交 #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 相比,它毕竟是不行的。但这是一个侧面,因为我们将构建新的和改进的提交的方式。