git checkout如何实施?

bre*_*nes 6 git implementation

在运行时git checkout,旧的mergebase HEAD和新的HEAD可任意远。朴素的实现是线性地应用每个差异,但操作会立即运行。

我有一个预感,可能是使用某种skiplisty来实现中间差异缓存,但这只是一个猜测。

有人知道它是如何实现的吗?谢谢!:)

Von*_*onC 5

你必须在结账如何(原则)所实现的一个很好的例子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