使用Git时文件系统表现及未提交修改跨分支可见原理咨询
Git未提交修改跨分支可见、提交后消失的底层逻辑
要搞懂这个问题,得先明白Git的三个核心区域:
- 工作区:就是你本地电脑上能直接打开编辑的文件目录,是日常操作的地方
- 暂存区(索引):Git用来临时存放待提交修改的“中转站”,介于工作区和版本库之间
- 版本库:Git真正存储所有提交历史、分支快照的核心区域,所有已提交的修改都存在这里
未提交修改跨分支可见的原因
当你在feature分支修改文件但没做git commit(哪怕做了git add但没提交),这个修改只停留在工作区或者工作区+暂存区,根本没进入版本库的分支快照里。
这时候切换到master分支,Git会做两件事:
- 从版本库取出master分支当前的提交快照
- 对比这个快照和你当前工作区的文件,如果没有冲突(比如master和你未提交的修改没改同一个文件的同一部分),Git不会覆盖工作区的内容——它默认你还在处理这个修改,不想弄丢你的工作成果。
所以不管切到哪个分支,只要修改没提交,工作区的改动就会保留,你自然能看到。
提交后修改消失的原因
当你在feature分支执行git commit后,Git会把暂存区的内容打包成一个提交对象,并让feature分支的指针指向这个新的提交。这时候,你的修改已经被正式存入版本库的feature分支专属快照里了。
当你切回master分支时,Git会直接从版本库取出master分支当前的提交快照,把工作区的所有文件替换成这个快照里的内容——因为master分支的快照还是你创建feature时的状态,完全没包含feature分支的提交修改,所以你就看不到那个改动了。
额外补充:冲突场景
如果你的未提交修改和目标分支的快照内容有冲突(比如两个分支改了同一个文件的同一行),Git会拒绝切换分支,提示你先提交或暂存修改,这也是为了防止你的未提交工作被覆盖或混乱。
内容的提问来源于stack exchange,提问作者ericj
相关产品推荐
相关产品推荐

