【讲清楚】rebase的使用

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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章