使用git暂存时如何落实「代码必须可编译」的提交规范?
解决方案
方案1:使用git stash临时存储未暂存修改(最简便)
你完全不需要手动备份文件或接受修改丢失,直接执行以下操作:
- 执行
git stash push --include-untracked,将当前工作区未暂存的所有修改(包括未被git追踪的新文件)临时存入git的stash栈,此时工作区会自动回退到你最近一次commit的状态 - 直接在当前目录执行编译验证,验证通过后执行
git stash pop,即可恢复所有之前未暂存的修改,全程不会丢失任何内容 - 如果编译不通过,执行
git stash pop恢复修改后,调整内容后重新add需要提交的文件,执行git commit --amend更新提交,重复上述流程即可
方案2:使用git worktree在独立目录验证(不改动当前工作区)
如果不想动当前工作区的任何状态,可以用git worktree直接创建一个指向目标commit的独立工作目录,完全隔离操作:
- 执行
git worktree add ../test-build <目标commit的hash>,git会在同级的test-build目录下创建一个完全独立的工作区,内容就是你要验证的commit的状态 - 进入../test-build目录执行编译验证即可,整个过程不会对原工作区的任何内容(包括未暂存修改)产生影响
- 验证完成后如果不需要保留该工作区,执行
git worktree remove ../test-build删除即可
前置优化:提交前直接验证暂存区状态,从根源避免问题
你可以在执行commit前就完成暂存区的编译验证,不需要提交后再回溯:
- 将要提交的内容add到暂存区后,执行
git stash push --keep-index --include-untracked,这条命令会把暂存区之外的所有修改存入stash,工作区保留的就是暂存区的内容 - 直接编译验证,验证通过后执行commit,再执行
git stash pop恢复未提交的修改即可
关于你提到的选项b的说明
暂存功能本身是可用的,多文件修改的原子性要求指的是单次提交的内容必须是原子的,而非不能拆分修改到多个提交。搭配上述工具链,你完全可以将不同逻辑的修改拆分到不同提交,同时保证每个提交都满足可编译要求。
内容的提问来源于stack exchange,提问作者g.pickardou
相关产品推荐
相关产品推荐

