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

为什么git软重置和提交会增加文件大小?,git,Git,假设我有一些git存储库,其中包含文件和许多提交。如果我这样做: git reset --soft $some_commit 然后修改一行并执行以下操作 git add file git commit -m message git push --force 我看到,与重置之前相比,.git文件夹中的文件大小实际上增加了很多,尽管这些文件实际上并不重。我想知道那里发生了什么。我原以为软重置会还原.git内部文件,但似乎并没有实际删除提交。我遗漏了什么吗?为了说明发生了什么,假设您有五次提交 A

假设我有一些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存储非常高效

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

这些提交并非完全无法实现。您仍然可以从访问它们,并在其上放置新标记或分支。例如,若你们意识到你们犯了一个错误,想要回去,你们可以把master移回原处

$ git reset --hard E
A - B - C - F
         \
          D - E [master]
还有。这是一个特殊标签,设置在您移动的位置。回到原来的git重置-软C ORIG_头仍在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足以让git压缩并打包.git。

在.git文件夹中哪些文件的大小?具体点。没有任何细节,听起来像是在做更改,这些更改必须记录在git文件中。您能否提供更多有关哪些文件正在增长以及您看到的增长类型的详细信息?相当多的增长对我来说可能意味着几个Gig,对其他人来说可能意味着几个字节。我将提供有关增长的文件的更多信息,但关于文件大小:假设我恢复1个修改两行的提交,然后进行一个新的提交,另外修改一个额外的行。非git文件的大小约为300kb,强制推送后,repo大小的增加量大致相同,所有的增加都发生在.git文件夹中。感谢您提供详细的答案。我不知道git自己做垃圾收集。@anymous.asker如果你想进一步深入。理解Git的工作原理对于更好地使用它至关重要。