为什么git软重置和提交会增加文件大小



假设我有一些git存储库,其中包含文件和许多提交。如果我这样做:

git reset --soft $some_commit

然后修改一行并进行

git add file
git commit -m message
git push --force

我看到.git文件夹中的文件大小实际上增加了很多(与重置前相比),尽管文件实际上并不重。想知道那里发生了什么。我认为软重置会恢复.git内部文件,但提交似乎实际上并没有被删除。我是不是错过了什么?

为了说明发生了什么,假设您有五个提交。

A - B - C - D - E [master]

然后你重置回C.

$ git reset --soft C
A - B - C [master]

D - E

恢复的提交仍在本地存储库中。重置不会删除它们,但不会引用它们。如果他们在几周内仍然没有被引用,他们将被垃圾收集。

然后你做出新的承诺。

$ git commit
A - B - C - F [master]

D - E

同样,旧的提交仍然存在。

从概念上讲,Git存储的是整个更改后的文件,而不仅仅是差异。如果你对一个大文件做一个微小的更改,.git可能会随着Git存储新副本而增加整个文件的大小。但Git最终会压缩其数据库以缩小其规模。如果你不耐烦,你可以运行git gc。一般来说,Git存储非常高效。

推送对本地存储库没有影响。


这些提交并非完全不可访问。您仍然可以从git reflog访问它们,并在它们上添加新的标记或分支。例如,如果您意识到自己犯了一个错误并想回去,您可以将master移回原来的位置。

$ git reset --hard E
A - B - C - F

D - E [master]

还有ORIG_HEAD。这是一个特殊的标签,设置在您移动的位置。回到最初的git reset --soft CORIG_HEAD仍将在E.上

$ git reset --soft C
A - B - C [master]

D - E [ORIG_HEAD]

你会回到那里。

$ git reset ORIG_HEAD
A - B - C

D - E [master]

它的工作方式既有利于Git提高效率,磁盘便宜,不必每次更改都优化存储,也让你改变主意。

如果您想清除所有无法访问的对象,可以运行git gc --prune=all。除非你的磁盘空间非常非常短缺,否则不要这样做。通常运行git gc就足以得到git来压缩和打包.git

最新更新