对 submodule 的理解

有时候我们希望顶层模块和子模块有独立的版本控制, 即顶层虽然需要子模块, 但是不需要让子模块的所有变化都在顶层模块的提交记录中出现. submodule 就是为了解决这个问题而存在的. 但是我一直很疑惑为什么作为 submodule 的 repo 已经提交过 commit 信息了, 上游却还是会出现关于 submodule 的 unstaged 内容.

实际上可能是我对 submodule 的理解有误. submodule 虽然能隔离版本控制, 但是却暗示了顶层模块对子模块的依赖, 也就是说顶层模块要在适当的时候更新依赖的子模块的版本. 所以虽然子模块的修改历史不会反映到顶层, 但是子模块的版本变化还是会反馈上去的. 这也是处于依赖的兼容性的考虑吧.

如果想纯粹引用而不需要考虑版本的话, 可以在.gitmodules中设置ignore=all. 不过如果使用zsh或者fish的话, 可能会发现提示符还是会提示有变化, 这就要在输出提示符时, 给git status加上--ignore-submodules==all这个选项, 虽然有误杀的可能, 还不知道有没有更好的做法.

push 写完整

有时候手懒直接码 ‘git push’, 就会出来一大片警告, 在推送新仓库时, 甚至一直推不上去. 发现要把远程仓库名和分支都写上去才是比较稳妥的做法.

rebase 的 squash

设置 squash 的 commit, 会启动编辑器让你确认 commit 信息, 注意这个 commit 信息代表的是上一个 commit, 也就是 squash 要合并进去的那个 commit, 但是它添加了被 squash 的这条 commit 的信息, 即默认是让你合并信息用的, 不需要的只要把对应的信息删了就行, 但是不要把它全删了.

rebase 时出现被注释的 commit

经过测试,被注释的 commit 是 empty commit……