据说在git垃圾收集期间,人们会仔细查看提交图并标记它们。
所有未标记的提交都将被删除,这称为GC。
问题是,如何实现未标记的提交?我无法确定此类提交可能如何存在?
答案 0 :(得分:4)
首先,值得注意的是,您通常不需要运行git gc
-git将在某些条件下自行自动运行垃圾收集。 git gc
只是迫使它立即发生。
git中的提交是不可变的,这意味着任何似乎更改提交的操作实际上只是在创建一个新的提交。例如,如果您要这样做:
$ git add my-file
$ git commit
$ git add another-file
$ git commit --amend
似乎修改了最后一次提交,但实际上只是创建了一个新提交。
这意味着旧的提交不再被任何东西引用。 git可能会立即摆脱旧的提交,但事实并非如此。当您犯下严重的错误时,这真的很方便,因为您可以找回旧的提交。
另一个可能更改提交的常见操作是rebase
。实际上,这是在树中的其他位置创建应用相同更改的新提交,并使旧提交未被引用。
另一种以未引用的提交(也称为悬挂的提交)结束的方法可以被垃圾回收,如果提交仅由标签或分支(例如尚未合并到master的分支)引用,则标签或分支被删除。