Git提交的波/粒子对偶

2020-12-25 09:08:35

我的许多朋友在遇到更高级的Git主题(例如git rebase)时都会感到困惑。这种误解通常发生在第一次合并冲突中,从而打断了rebase过程。混乱的中心通常是Git如何将一个提交重新应用于另一个提交。我的朋友对为什么快照可能会发生合并冲突感到困惑。他们认为最终状态应该是什么不是很明显吗?

为了了解正在发生的事情,首先必须快速绕过量子物理学-舌头牢固地扎在脸颊上。

如果您还不太熟悉这种明显的量子胡话的特殊风格,恐怕您会变得更加困惑,事实证明,光子(和电子等)这样的粒子具有两种经典的特性。这会产生诸如众所周知的双缝实验之类的实验结果。如果光子通过狭缝发射到一片薄膜上,它们会在穿过狭缝的地方形成一个能带,就像光子是粒子一样但是,穿过两个并排狭缝的光子会相互干扰,从而在一片胶片上产生干涉图案,就好像光子是波一样。

因此,重要的是要认识到光子既不是粒子也不是波,而是表现出既像粒子又像波的某种奇怪事物。

可以很容易地看到许多Git操作将提交视为快照。每个Git用户都知道如何使用checkout:

$ git checkout 42bd1ef5&& ls -lhHEAD现在为42bd1ef调整社交链接的填充总计48Kdrwxr-xr-x 2 georgev georgev 4.0K Jun 1 2019原型sdrwxr-xr-x 3 georgev georgev 4.0K Jun 1 2019资产drwxr-xr-x 2 georgev georgev 4.0K 1月2019年图像drwxr-xr-x 7 georgev georgev 4.0K 8月25日13:27 layouts-rw-r--r-- 1 georgev georgev 9.3K 1月4日12:21 README.mddrwxr-xr-x 3 georgev georgev 4.0K 8月15日01:01 static-rw-r--r-- 1 georgev georgev 712 2019年6月1日theme.toml

但是其他命令(例如show)会输出统一的diff(即补丁):

$ git show 42bd1ef5commit 42bd1ef5c5541815ad0ae4eba2c695387228e719作者:George Hilliard< [email protected]>日期:星期二十二月31 10:43:45 2019-0600调整社交链接的填充diff --git a / assets / scs / de-hyside。 scss b /资产/scss/hyde-hyde/_sidebar.scss索引0686b42..6b34856 100644 --- a / assets / scss / hyde-hyde / _sidebar.scss +++ b / assets / scss / hyde-hyde / _sidebar .scss @@ -54,7 +54,7 @@ .social {text-align:center; {{-padding:0 4px; +填充:0 7px; @include link-no-decoration(); }}

两个命令中都存在相同的提交哈希。没有“ --as-patch”或“ --as-snapshot”标志来表示差异。实际上,我指的是同一对象。这是怎么回事?

看起来,提交既不是斑块也不是快照,除非它们被观察到。它们是一种奇怪的东西1,可以将其视为斑块或快照,就像光子既具有粒子又具有波动的性质一样。

当Git将提交视为补丁时,它显示为快照与其父级快照之间的差异;当Git将提交视为快照时,它显示为进行提交时位于暂存区域中的文件树。

Git提交的这种双重性使得能够执行诸如rebase之类的操作.rebase,cherry-pick,format-patch等Git命令都将Git提交视为补丁而不是快照。 rebase操作突然变得更加有意义:Git接受一串提交,将它们解释为补丁,并将其应用于您指定的提交。

如果此过程顺利进行,则会创建一个新的commit字符串,并根据原始的commits-as-patches修改目标快照。因此,这也是为什么rebase可能会创建“合并冲突”的原因:它是补丁,而不是快照,那将不能完全适用。

也许这是一种愚蠢的思考提交方式的方法,但是当我以这种方式进行解释时,它至少对其他人有所帮助,希望对您有所帮助。

这种双重性扩展到了底层的存储格式:单个提交的存储方式与快照非常相似:它们是引用“ blob”的“树”,所有引用均由“ commit” blob引用。 但是,包文件的存储方式类似于补丁,对象可以选择以“增量”的形式存储到包中较早出现的另一个对象。 这是大多数Git用户不需要了解的内部细节。 ↩︎