目前有多于三个的log,而我想要合并最近的两个 log, 也就是上图中紫色的圈和黄色的圈,所以这个时候使用rebase的方式如下:
git rebase -i ee9ee598ea2a4bece9b23
注意这个时候的应该使用的log的编码是红色的圈,虽然我想要合并紫色和黄色,但是需要在红色圈的基础上进行合并,所以需要填入ee9ee598
填完之后,需要对log进行重新选择,
pick82b5047ChangesforMapLoad(changedInitKeyFrameforEUCMbasedonORI_Ver)pickeddaa2bLoadMap#Rebasea71eba2..e1a7dfaontoa71eba2#Commands:#p,pick=usecommit#r,reword=usecommit,buteditthecommitmessage#e,edit=usecommit,butstopforamending#s,squash=usecommit,butmeldintopreviouscommit#f,fixup=like squash ,butdiscardthiscommit\'slogmessage#x,exec=runcommand(therestoftheline)usingshell#Theselinescanbere-ordered;theyareexecutedfromtoptobottom.#IfyouremovealinehereTHATCOMMITWILLBELOST.#However,ifyouremoveeverything,therebasewillbeaborted.#Notethatemptycommitsarecommentedout
这个文件中的log是按照提交的时间顺序来的,提交的时间最早的log,就会在出现在 最上面,这样给了我们更清楚的知识,究竟保留哪个,去掉哪个?
pick即为保留的意思,如果pick某个hash,那个这一次提交的代码修改将会被保存;
squash表示那一次的提交内容将会和它的上一个log合并到一起;squash很适用于那种commit完成后发现自己没有add全的情况;
reword表示当前的commit记录会被保留,但是允许你修改commit的comment,使用与commit -m ”“ 时写错log的情况;
fixup就更彻底了,会将当前的提交代码与上一次的提交合并到一起,同时直接删除掉当前的log message,跟在下面图2的文件中注释掉其实是一样的效果;
一般情况下,squash是最常用的,即保留文件中的修改和commit的提交,只是将这次的commit与上一次的合并而已,所以需要将上述文件修改成:
pick82b5047ChangesforMapLoad(changedInitKeyFrameforEUCMbasedonORI_Ver)seddaa2bLoadMap
然后ctrl+x 离开,其中会提示是否需要保存,选择YES即可;
然后会遇到如下文件:
这个文件主要是需要选择新的commit 的comment,也就是log message内容,如果不想要什么可以直接用#把他们注释掉,
因为我合并和紫色和黄色的两个圈圈log,并且觉得黄色圈圈的log内容更加准确,所以,就选择留下第三行的文字;
那么最后合并后的log内容为
从如上的合并可以看出,红色的圈圈没变,但是紫色圈圈和黄色圈圈都不存在了,而合并成立绿色圈圈,同时绿色圈圈的commit 内容选用了紫色圈圈的内容;
更多理论参考:
https://git-scm.com/book/zh/v2/Git-%E5%88%86%E6%94%AF-%E5%8F%98%E5%9F%BA
本文链接: http://everybase.immuno-online.com/view-733346.html