场景:本地做了四次提交,想把第 2、3、4 次提交合并,只保留第二次提交的commit message
解决方案:
1、git reflog 查看所有的提交记录
p.s. git reflog 可以查看所有分支的所有操作记录(包括已经被删除的 commit 记录和 reset 的操作);git log 命令可以显示所有提交过的版本信息,看不到删除的记录。所以买后悔药回退删除记录的时候,可以用 git reflog
上面的图片展示了,一共四次提交,按照时间倒序排列分别是 第 4、3、2、1次提交
2、git rebase -i “最新的一个想保留的 Commit”
意思是,我想合并2、3、4,那么最新一个想保留的 commit 就是 第一次 commit,他的hash值为 ae9c811,输入下列命令并回车
git rebase -i ae9c811
或者
# 即将可以编辑的信息不包括起点,包括终点,起点比终点距离现在时间久远
git rebase -i [startpoint] [endpoint]
3、选择要合并的 commit :上述步骤完成后会跳出下图界面
注意这个时候的顺序:最近一次提交在最下面
前面三行是我们需要操作的三个 Commit,每行最前面的是对该 Commit 操作的 Command。关于每个 Command 具体做什么,下面的注释写得非常清楚。为了完成我们的需求,我们可以关注到这两个命令:
# 使用该 Commit,但会被合并到前一个 Commit 当中
s, squash <commit> = use commit, but meld into previous commit
# 就像 squash 那样,但会抛弃这个 Commit 的 Commit message
f, fixup <commit> = like "squash", but discard this commit's log message
我们可以选择把第 3、4 次的commit message合并到第二次上面,修改command如下,并保存退出:
4、编辑合并 commit 的 commit message
上述步骤完成后,会跳出如下界面
通过下面的注释,我们可以知道,这里其实就是一个编写 Commit Message 的界面,带 # 的行会被忽略掉,其余的行就会作为我们的新 Commit Message,于是,我们编辑一下,保存退出
5、检查:使用git log检查
git log
结果如下:
注意,使用git reflog仍可以查看最初的命令:
两者的区别在于,git log只显示保留的,git reflog可以显示 reset 和 rebase、删除的版本
编译器的可视化git工具中的展示:
这个时候再push,提交记录上就非常好看了
请注意: