bre*_*nes 6 git implementation
在运行时git checkout,旧的mergebase HEAD和新的HEAD可任意远。朴素的实现是线性地应用每个差异,但操作会立即运行。
我有一个预感,可能是使用某种skiplisty来实现中间差异缓存,但这只是一个猜测。
有人知道它是如何实现的吗?谢谢!:)
你必须在结账如何(原则)所实现的一个很好的例子JavaScript实现的Git(作为练习)Gitlet由天保库克。
参见带注释的源代码
对于结账的步骤是:
checkout()更改索引,工作副本和HEAD以反映的内容ref。
ref可能是分支名称或提交哈希。- 获取提交的哈希值以检出。
- 如果
ref找不到,则中止。- 如果要检出的哈希值指向不是提交的对象,则中止。
- 如果ref是当前检出的分支的名称,则中止。如果head被分离,
ref则中止,它是一个提交哈希,HEAD并指向该哈希。- 获取工作副本中已更改文件的列表。
获取在头提交和要签出的提交中不同的文件的列表。
如果两个列表中都出现了文件,则中止。- 否则,请执行结帐。
- 如果
ref位于对象目录中,则它必须是哈希值,因此此签出将使头部分离。- 获取当前提交和要检出的提交之间的差异列表。将它们写入工作副本。
- 将正在检出的提交写入
HEAD。
如果头部分离,则将提交哈希直接写入HEAD文件。
如果磁头未卸下,则将检出的分支写入HEAD。- 将索引设置为要检出的提交的内容。
- 报告结帐结果。
同样,这是一个简化(与实际的Git代码相比),但是对于应该如何进行结帐提供了很好的思路。
有关更多信息,您可以在Thomas Ferris Nicolaisen的Gitlet播客中收听GitMinutes#31:Mary Rose Cook。
| 归档时间: |
|
| 查看次数: |
609 次 |
| 最近记录: |