-
步骤概括
-
查看提交的历史
git log --graph --pretty=oneline --abbrev-commit
-
用
git rebase
合并提交-
从
HEAD版本
开始合并,包括HEAD版本
,到之前的n
个提交git rebase -i HEAD~n
-
(可选,通常在合并大量 commit 的时候使用)指定一个前开后闭的合并提交的区间,
startpoint
和endpoint
,意思就是startpoint
不参与合并。startpoint
和endpoint
的值是 commit id,比如具体操作第 1 步中的 326e415
git rebase -i [startpoint] [endpoint]
参数说明:
- -i 的意思是
--interactive
,即弹出交互式的界面让用户编辑完成合并操作 - startpoint 和 endpoint 指定了一个编辑区间
- 如果不指定 endpoint,则该区间的终点 endpoint 默认是当前分支 HEAD 所指向的提交
-
-
-
具体操作(后面主要转载此链接)
-
git log
查看提交历史如
-
比如执行
git rebase -i HEAD~3
会弹出类似以下合并设置窗口上图的内容改成如下的意思就是把第二次、第三次提交都合并到第一次提交上。
pick 85697ee This is first commit. squash ee461c1 This is second commit. squash 326e415 This is third commit.
-
操作说明:
- pick:保留该 commit(缩写:p)
- reword:保留该 commit,但我需要修改该 commit 的注释(缩写:r)
- edit:保留该 commit, 但我要停下来修改该提交(不仅仅修改注释)(缩写:e)
- squash:将该 commit 和前一个 commit 合并(缩写:s)
- fixup:将该 commit 和前一个 commit 合并,但我不要保留该提交的注释信息(缩写:f)
- exec:执行 shell 命令(缩写:x)
- drop:我要丢弃该 commit(缩写:d)
-
注意 ❗
第一个提交不能是
squash
,因为如图说明,它们是从头到尾的串行执行,且squash
的意思是将该 commit 和前一个 commit 合并。如果读者也遇到只需要保留其中某个 commit 的信息,可以先保证第一行是
pick
操作,之后都是合并到第一行,在本文后续第四步的最终提交的编辑窗口再确定和输入此次合并的 commit 信息 -
温馨提醒
如果读者有大量 commit 要合并,在进入合并设置窗口后,可以结合 vim 的丰富编辑功能操作,比如快速替换除第一行外的
pick
为squash
-
显示行号
:set number
-
Vim 在选定范围内查找和替换
:<start line number>, <end line number>s/old/new/g
如笔者要合并 11 个 commit 则:2,11s/pick/squash/g
,回车
-
-
-
:wq
保存退出,Git 会压缩提交历史。如果有冲突,需要修改,修改的时候要注意,保留最新的历史,不然我们的修改就丢弃了。修改以后要记得敲下面的命令:
git add . git rebase --continue
如果你想放弃这次压缩的话,执行以下命令:
git rebase --abort
-
如果没有冲突,或者冲突已经解决,则会出现最后的本次合并提交的 commit 说明编辑窗口
比如
Commit feature branch! #This is first commit. #This is second commit. #This is third commit.
:wq
保存提交后即可再查看日志git log --graph --pretty=oneline --abbrev-commit
-
-
参考链接
https://www.cnblogs.com/sunbines/p/15478014.html
git rebase 合并提交,精简 git log
于 2024-09-13 17:37:28 首次发布