1

我了解当我checkoutreset --hard特定提交/分支时,我会在我的工作目录和索引文件中获得相关内容。

但是 Git 如何在内部重新构建索引和工作目录内容checkoutreset --hard.

是否通过读取我们已签出/重置到的提交指向的树来完成索引恢复?

工作目录是否也以同样的方式恢复?

这是否意味着之后reset --hardcheckout <some_branch>索引和工作目录将始终与该提交的树匹配,因为它们是从中重建的?


编辑:我基本上要问的是:索引/WD 内容的恢复是使用我们到达的提交指向的树完成的吗?因为在我看来,git 没有其他方法可以获取该内容,而不是从提交历史记录中获取

4

2 回答 2

0

这是否意味着在 reset --hard 或 checkout 之后,索引和工作目录将始终与该提交的树匹配,因为它们是从中重建的?

简短的回答:是的

长答案:

git checkout

更新工作树中的文件以匹配索引或指定树中的版本。

https://git-scm.com/docs/git-checkout

git-reset --hard

重置索引和工作树。此后对工作树中跟踪文件的任何更改都将被丢弃。

https://git-scm.com/docs/git-reset

这两个命令都 move HEAD,然后检查它被移动到的任何提交,并相应地更改索引和/或 WD。如果它不改变一个或两个,它仍然充当该提交时文件状态的保持者,并允许您运行命令以将您的 WD 和索引与您当时的文件状态进行比较时间。

我希望这会有所帮助,我不确定您的问题到底在寻找什么。

于 2020-04-09T14:31:13.837 回答
-1

不完全是。至少,不适用于工作目录。

老实说,我花了几分钟才弄清楚你的问题可能意味着什么。您是在询问工作目录是否会在运行您说您知道将工作目录设置为与签出提交匹配的命令后最终匹配签出提交,所以问题是......有点模糊。

但是在某些情况下,工作目录最终会与签出提交中的内容不同。例如,被忽略(或未跟踪)的文件通常不会受到干扰。在某些情况下这是不可能的;也许我有一个名为 的未跟踪文件foo,但目标树有一个也在foo同一路径命名的文件。不同的命令处理不同。(重要的是要注意,这checkout commit是一个非常不同的命令checkout commit -- path。)一些命令会破坏你的本地未跟踪数据(然后将无法恢复,至少就任何 git 机制而言),而其他命令会中止并警告你本地更改将被覆盖。

因此,说工作树是从目标树“重建”是不完全正确的——因为目录不是完全rm“d”然后从树数据重新创建的。而是根据需要添加、删除或替换文件(无论如何这是一个更有效的过程)。

对于索引:很难显示索引没有完全重建的任何“症状”,因为索引中没有与未跟踪文件类似的概念。我希望 git 能够利用它为所有内容存储的哈希值,这样它就会再次更改需要更改的内容,而不是完全重建;但在这种情况下,我不能 100% 确定,这是一个并不重要的实现细节。如果您告诉 git 设置索引以匹配提交,则索引将匹配提交。

于 2020-04-09T15:11:10.263 回答