如果提交是快照,那么为什么 `git stash pop` 会保留存储之后的更改?
If commits are snapshots, then why does `git stash pop` retain your changes from after the stash?
为了更好地理解 git,我了解到:
- 提交不是 changes/deltas,它们是快照
- 存储是提交
多年来我一直假设提交是增量,但它们实际上是快照。知道了
现在我这样做:
- 在文件 A 中键入一些文本
- 藏起来
- 在文件 B 中键入一些文本
- 提交
- 隐藏流行音乐
我预计 stash pop 会删除文件 B 中的文本,因为它正在应用添加此文本之前的项目快照。但事实并非如此,它应用存储就像它是增量,而不是快照。
那么我在这里缺少什么?提交快照的真正含义是什么?
it applies the stash as if it is a delta, not a snapshot
正确。它在 本身 中是一个快照,但是“应用”是一种合并形式,并且从它形成的 HEAD 开始执行为 diff .隐藏提交没有删除文件 B 中与之前的 HEAD 提交相关的文本,因此应用它不会删除文本。
如果您不了解合并逻辑,您可能想阅读我的https://www.biteinteractive.com/understanding-git-merge/。不仅合并自身,而且还原、挑选、变基和您的“应用”都使用合并逻辑。 (这就是为什么它们中的任何一个,包括应用存储,都可能由于合并冲突而失败。)
为了更好地理解 git,我了解到:
- 提交不是 changes/deltas,它们是快照
- 存储是提交
多年来我一直假设提交是增量,但它们实际上是快照。知道了
现在我这样做:
- 在文件 A 中键入一些文本
- 藏起来
- 在文件 B 中键入一些文本
- 提交
- 隐藏流行音乐
我预计 stash pop 会删除文件 B 中的文本,因为它正在应用添加此文本之前的项目快照。但事实并非如此,它应用存储就像它是增量,而不是快照。
那么我在这里缺少什么?提交快照的真正含义是什么?
it applies the stash as if it is a delta, not a snapshot
正确。它在 本身 中是一个快照,但是“应用”是一种合并形式,并且从它形成的 HEAD 开始执行为 diff .隐藏提交没有删除文件 B 中与之前的 HEAD 提交相关的文本,因此应用它不会删除文本。
如果您不了解合并逻辑,您可能想阅读我的https://www.biteinteractive.com/understanding-git-merge/。不仅合并自身,而且还原、挑选、变基和您的“应用”都使用合并逻辑。 (这就是为什么它们中的任何一个,包括应用存储,都可能由于合并冲突而失败。)