Git rebase
git original log:
目前有多于三个的log,而我想要合并最近的两个 log, 也就是上图中紫色的圈和黄色的圈,所以这个时候使用rebase的方式如下:
git rebase -i ee9ee598ea2a4bece9b23
注意这个时候的应该使用的log的编码是红色的圈,虽然我想要合并紫色和黄色,但是需要在红色圈的基础上进行合并,所以需要填入ee9ee598
填完之后,需要对log进行重新选择,
pick 82b5047 Changes for MapLoad (changed InitKeyFrame for EUCM based on ORI_Ver)
pick eddaa2b Load Map
# Rebase a71eba2..e1a7dfa onto a71eba2
# Commands:
# p, pick = use commit
# r, reword = use commit, but edit the commit message
# e, edit = use commit, but stop for amending
# s, squash = use commit, but meld into previous commit
# f, fixup = like "squash", but discard this commit's log message
# x, exec = run command (the rest of the line) using shell
#
# These lines can be re-ordered; they are executed from top to bottom.
#
# If you remove a line here THAT COMMIT WILL BE LOST.
#
# However, if you remove everything, the rebase will be aborted.
#
# Note that empty commits are commented out
这个文件中的log是按照提交的时间顺序来的,提交的时间最早的log,就会在 出现在 最上面,这样给了我们更清楚的知识,究竟保留哪个,去掉哪个?
pick即为保留的意思,如果pick某个hash,那个这一次提交的代码修改将会被保存;
squash表示那一次的提交内容将会和它的上一个log合并到一起;squash很适用于那种commit完成后发现自己没有add全的情况;
reword表示当前的commit记录会被保留,但是允许你修改commit的comment,使用与commit -m ”“ 时写错log的情况;
fixup就更彻底了,会将当前的提交代码与上一次的提交合并到一起,同时直接删除掉当前的log message,跟在下面图2的文件中注释掉其实是一样的效果;
一般情况下,squash是最常用的,即保留文件中的修改和commit的提交,只是将这次的commit与上一次的合并而已,所以需要将上述文件修改成:
pick 82b5047 Changes for MapLoad (changed InitKeyFrame for EUCM based on ORI_Ver)
s eddaa2b Load Map
然后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