为了实验起见,假设您的git log标识了以下提交

commit 16bc8486fb34cf9a6faf0f7df606ae72ad9ea438  // added 2nd file
commit 9188f9a25b045f130b08888bc3f638099fa7f212  // initial commit

提交后,.git/refs/heads/master指向16bc8486fb34cf9a6faf0f7df606ae72ad9ea438。

假设在此之后,我手动编辑.git/refs/heads/master文件以指向9188f9a25b045f130b08888bc3f638099fa7f212

在这一点上,git status识别出一个新的未提交文件需要引起注意。这是我的第二次提交之前处理过的同一文件。

如果我确实提交它.. git log现在显示
commit b317f67686f9e6ab1eaabf47073b401d677205d5  // 2nd file committed for the 2nd time
commit 9188f9a25b045f130b08888bc3f638099fa7f212  // initial commit

问题1:

您会注意到,我第一次提交第二个文件和现在的SHA哈希值是不同的。这是为什么?文件的内容没有改变,仍然是相同的文件。

问题2

此时,最初的第二次提交发生了什么?当我执行git show 16bc8486时,它显示此提交。但是,它不会显示在git log历史记录中。

最佳答案

问题1:因为哈希是在考虑到所有因素之后生成的,包括提交元数据(其本身包含日期和时间)。

问题2:git log显示当前分支的日志。提交16bc8486不属于其中。据我所知(我不确定),垃圾收集器迟早会删除它,如果它发现没有引用它的东西(git gc --help)。

关于git - 是否仅根据树的内容计算提交的SHA-1?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/8873169/

10-14 13:23
查看更多