问题场景

  1. 波仔新入职了一家公司,公司采用git来管理代码。第一天新入职的波仔很快就写好了频道管理模块的CRUD,波仔很开心的哼着歌就回家了, 第二天波仔又接到了一个单表敏感词管理的CRUD任务, 聪明的波仔也很快的完成了 不过他突然想起昨天的代码还没commit, 而现在想commit的时候发现 频道管理的代码 敏感词管理的代码都通过`git add`命令加入到了暂存区。<br />![](https://cdn.nlark.com/yuque/0/2022/png/22724064/1655780105388-26b060e2-d5db-4cee-81c1-7a0b894c9a5b.png#crop=0&crop=0&crop=1&crop=1&id=LaLis&originHeight=813&originWidth=690&originalType=binary&ratio=1&rotation=0&showTitle=false&status=done&style=none&title=)<br />![](https://cdn.nlark.com/yuque/0/2022/png/22724064/1655780105537-89727515-70df-4a3c-ba27-07556a83ff8f.png#crop=0&crop=0&crop=1&crop=1&id=DvMDh&originHeight=532&originWidth=672&originalType=binary&ratio=1&rotation=0&showTitle=false&status=done&style=none&title=)<br />这时如果commit 的话,相当于把两天的任务提交到一起了。 公司的git管理是有规范的 , 他的两个模块的代码要分两次提交才可以。 **那么问题来了, 代码已经全部通过提交到了暂存区,如何将暂存区的代码分为多次commit提交呢?**<br />**当前代码:**<br />![](https://cdn.nlark.com/yuque/0/2022/png/22724064/1655780105628-090c917f-2f10-440c-8f1a-a7359c41c784.png#crop=0&crop=0&crop=1&crop=1&id=Td94z&originHeight=692&originWidth=1207&originalType=binary&ratio=1&rotation=0&showTitle=false&status=done&style=none&title=)<br />**当前git情况:**<br />![](https://cdn.nlark.com/yuque/0/2022/png/22724064/1655780105725-9ed4381e-df18-478c-8d79-25ec4ea450cf.png#crop=0&crop=0&crop=1&crop=1&id=QTjF5&originHeight=575&originWidth=1470&originalType=binary&ratio=1&rotation=0&showTitle=false&status=done&style=none&title=)

解决思路

基本思路:

  1. 全部或部分撤销暂存区代码到work工作区
  2. 重新提交所属功能代码到暂存区
  3. commit提交代码到版本库
  4. 再次提交其它功能代码到暂存区
  5. commit提交代码到版本库
  6. 有多次重复上面操作

    动手实践

    基于idea工具解决

    点击提交代码 Default Channgelist 变更清单中,只勾选第一天的变更代码 填写提交信息,点击commit提交 完成频道管理commit提交

如何将暂存区的多个功能代码分成多次提交 - 图1

再次点击提交代码 Default Channgelist 变更清单中,勾选第二天的变更代码 填写提交信息,点击commit提交 完成敏感词管理commit提交

如何将暂存区的多个功能代码分成多次提交 - 图2

点击下方git : log日志 查看

如何将暂存区的多个功能代码分成多次提交 - 图3
两次commit提交记录

基于git命令行解决

输入 git add -i 进入暂存区交互式窗口

如何将暂存区的多个功能代码分成多次提交 - 图4

  1. 暂存区的文件路径及提交情况
  2. 要交互执行的命令:
  3. status: 暂存区状态 和 git add -i 效果类似
  4. update: 可以将已经tracked的文件添加到暂存区
  5. revert: 可以根据提示选择,将暂存区文件删除
  6. add untracket: 可以将未跟踪tracked的文件添加到暂存区
  7. patch: 用于离线打补丁,通过代码版本
  8. diff: 对比暂存区文件 和 仓库源文件差异
  9. quit: 退出交互式窗口
  10. help: 查看帮助
  11. what now: 你现在要做什么呢?
    输入上面指令对应的数字 或 首字母 即可执行对应指令

    what now>> 输入 3 回车

如何将暂存区的多个功能代码分成多次提交 - 图5
弹出暂存区文件列表
并且下面的命令行窗口 提示: revert>>
我们可以按要求输入 文件的编号,多个文件以空格隔开
这些文件,是要从暂存区删除的哦
比如:
现在要提交 频道管理的代码, 那么先把敏感词的代码从暂存区删除
敏感词对应的文件编号: 2 4 6 8 10

revert>> 输入 2 4 6 8 10 回车

如何将暂存区的多个功能代码分成多次提交 - 图6
弹出暂存区文件列表
选择revert的文件编号前,有 * 号标记
再次回车 这些文件 会从暂存区删除

revert>> 回车

如何将暂存区的多个功能代码分成多次提交 - 图7
敏感词相关文件,已经变为 untracked 未跟踪状态

what now 输入 1 (查看状态)

如何将暂存区的多个功能代码分成多次提交 - 图8
暂存区中,只剩下频道管理的代码
这时退出交互窗口 commit 提交代码 就可以了

what now 输入 7 退出交互窗口

如何将暂存区的多个功能代码分成多次提交 - 图9

输入git commit -m '功能:开发完成频道管理CRUD'

如何将暂存区的多个功能代码分成多次提交 - 图10
完成频道管理模块代码提交

输入git add . 将敏感词代码再次提交到暂存区, 并查看git status

如何将暂存区的多个功能代码分成多次提交 - 图11

输入git commit -m '功能:开发完成敏感词管理CRUD'

如何将暂存区的多个功能代码分成多次提交 - 图12

输入git log查看提交记录

如何将暂存区的多个功能代码分成多次提交 - 图13
暂存区的代码,已经分为两次commit啦

企业规范建议

通过idea工具,比较简单,但依赖工具
通过原生命令,稍稍复杂些,但不依赖其它工具
如果文件很多,通过交互式窗口选择比较麻烦的情况下 也可以使用命令清空暂存区, 然后在有选择的
add + commit

git rm --cache [fileName]    删除暂存区文件的指定文件(本地工作区未删除)

这样,波仔的问题就解决啦~ 怎么样 简单吧,大家快试试吧!