今天突然发现,在 IDEA 上切换分支,竟然将上一个分支的内容同步到了新的分支,起初还以为切换分支失败了,结果 IDEA 提示分支切换成功,这就很奇怪了,理论上切换分支是不会将上一个分支没有 commit 的内容同步过来新分支的,因为这种操作会被 Git 阻止,就不应该切换成功,但是的确是切换成功了,修改也同步迁移到了新的分支,这使我十分混乱。
不过使用了这么久的 Git,也猜到了不是它的问题,这个问题不用想,可以肯定是出在 IDEA 上。

测试触发手段

  1. IDEA 内嵌的分支切换功能
  2. Git 切换分支(IDEA 运行时)

发现当上面两种方式,在还有修改没有提交时是可以切换分支的,并且可以将没有提交的修改同步到新的分支中。
这里已经可以完全肯定是 IDEA 的问题了,但是我没有想到,在 IDEA 运行期间,且项目目录和 Git 项目是同一个时,使用 Git 命令行的切换也是会触发。看来 IDEA 是监测了 Git 的行为,当需要切换分支时,保存当前修改到缓存,将工作区清理干净,所以 Git 可以切换成功,到时候 IDEA 再自动修改文件,基本就完成了整个过程。
脑补完整个过程,开始在 IDEA 里面寻找相关的设置,这个功能这么有趣,应该是可以设置开关状态的,果不其然,在版本管理的设置里面逛了好一会,发现了这个有趣的功能,因为以前没有在 idea 上进行“违规”的分支切换,所以一致不知道这个功能的存在。
这是一个叫做 Restore workspace on branch switching 的可勾选项,翻译过来大概意思就是“切换分支时自动恢复工作区”,这句话也不难理解,就是说将你在切换分支前,没有 commit 的修改内容同步到新的分支中,而在原生的 Git 里面,这种行为是不会被支持的。
当取消勾选,重启 IDEA 之后,再尝试未提交修改的前提下切换分支,果然被 IDEA 阻止,弹出提交窗口提示我提交代码。