【发布时间】:2021-03-29 02:02:23
【问题描述】:
我知道git fetch 做了什么以及如何使用这个命令。
我对内部结构感兴趣:Git 如何确定要传输的确切提交?
例如下面的情况
本地仓库:
A - B - C - D master
\ \- E - F feature1
\- G feature2
原产地:
A - B - C - D - D1 - D2 master
\ \- E - F - F1 - F2 feature1
\- G - G1 feature2
git fetch 需要下载提交 D1、D2、F1、F2 和 G1。
天真地,我的 git 客户端可以将本地提交 SHA(A、B、C、D、E、F、G)列表发送到远程存储库。远程存储库会找到所有不在我列表中的 SHA(D1、D2、F1、F2、G1)并将它们发回给我。对于大型存储库,这将涉及发送大量数据并进行大量计算。发送到远程仓库的数据将与提交的总数成正比。
我确信使用了更聪明的方法。
仅发送每个分支(D、F、G)的尖端的 SHA 就足够了吗?跟踪远程 repo 的父母可以确定 repos 共享的提交并确定丢失的提交。发送到远程仓库的数据将与(未合并的)分支的总数成正比,这通常远低于提交的数量。
它是否适用于所有情况(后面的分支、前面的分支、重新定位的分支)?
还有其他想法吗?我期待一个基于图论的漂亮解决方案:-)
【问题讨论】:
-
感谢您的链接。前段时间我确实读过这本书,但我一定只是略过了这一章:-)