视频教程
不想看文档,这里也有视频教程:http://v.uninote.com.cn/video_play.html?video_url=https://admin.bb.uninote.com.cn/oss?path=video/upload/202109/20210915_224351.mp4
背景
有时我们需要将多个提交重新整理,比如按任务拆分成独立的若干个提交,比如这个例子,六个“优化”提交,其实包含了三个任务。
很简单,只要用好 reset 命令就行。可以将以下命令保存为 shell 脚本,比如取名为 cs(commit splitter 的简写),方便后面使用:
#!/bin/bash
### commit splitter
git reset --hard $1
git reset --soft HEAD@{1}
开始拆分
注意,这里的 src 和 base 是我自己加的 tag,如果照着命令敲,注意也在自己的项目中的相应位置加上这两个标签。
第一步,将当前分支(master) 重置到 base,这是我们要重新整理的开始。
git reset base
第二步,执行刚才保存的脚本(tag src只是为了说明需要,其实只需要直接复制 commit hash 值即可):
$ cs src
HEAD is now at e4df33f 优化
看下当前工作空间的状态,总共添加了三个文件,改了两个(这就是我们所有任务合并在一起的修改):
我们第一个任务包含的images/dir.png,以及 listshow.php 中的部分修改:
此时最简单的做法,就是在比较软件中撤销掉不需要的修改,保留需要的:
取消掉不需要提交的文件选中状态:
然后提交,一个 commit 就拆分出来了:
重复第二步,直到全部提交拆分完成...
补充说明
- 在第二步时,我们查看工作空间的状态,可以发现,少了一个文件,并且 showlist.php 这个文件的修改行数变少了(因为减少的改动被包含到了上次提交中):
- 这里只讨论拆分,基础的 git 操作就不赘述了
- 使用 TortoiseGit 来说明,只是为了简介明了,完全用命令行,也能实现
- 完成后历史变成了这个样子:
- 完成后比较 master 和 src,内容上应该没有任何不同(命令无任何输出):
- 如果不想被 git 困扰,建议这篇文章认真读一读:https://git-scm.com/book/en/v2/Git-Tools-Reset-Demystified
2021-4-2