浅谈git rebase命令
如果你只想修改git log
命令打印到终端上的最后一个提交信息,那么使用git commit --amend
命令直接修改就好。
如果你还想合并最近的某几个提交为一个提交,并重新为这个化多为一
的新的提交信息的话,那么就要考虑使用git rebase -i HEAD~n
命令,注意其中n
是一个具体的数字,即你一共想合并的提交的个数。
例如如果n
为3
,则你会得到这样一个界面
根据下面的提示,修改上面那三个pick
,注意如果是squash
的话,第一个pick
是不可以被修改为sqush
的,因为第一个指的是,剩下两个提交是要合并到第一个提交里的,把第一pick
也改为squash
的话,那么git
就不知道该把这三个往哪合并了。
注意上面这个界面只是用来让你修改pick
的,其他的东西不需要动。
pick
,指啥也不变(我的理解)
reword
,指不合并,但是可以直接修改后面的提交信息,这里的直接修改不是在这个界面修改,这个界面只用来让你修改pick
的,其他的不要动。将第三行的pick
修改为reword
之后,保存并退出,git
会直接创建一个vim
会话窗口,此时你就可以修改提交信息了。
这里直接修改第一行的提交信息就行,其他的也不用动,然后保存并推出就完成了reword
的功能。
edit
,这个命令看似跟reword
差不多,但是不能随便用,因为如果你把第二行的pick
改为edit
,那么这里的意思就是丢弃第三行的提交,直接修改第二行的提交信息,保存并退出后,需要手动使用git commit --amend
去把修改窗口调用出来,然后才能修改提交信息;如果你后悔了,那么可以使用git rebase --abort
放弃本次修改。这里的git rebase --continue
的意思是,如果你不使用git commit --amend
修改提交信息,也不用git rebase --abort
放弃本次操作,那就默认不修改提交信息并完成本次操作。
所以这个命令有一定危险性,没想清楚不要随便用。
squash
,指的是将当前提交合并至上一个提交,注意因为是合并至上一个提交(范围在出现在这个界面的),所以第一行是没有上一个提交的,所以无法将第一行的pick
改为squash
。修改完pick
后就可以保存并退出,git
会自动弹出修改提交信息的窗口,把本来的多个提交信息修改为一个就可以了。(可以同时修改多个pick
为squash
,除了第一个pick
不能被修改以外,都可以修改为squash
)
fixup
,fixup
是仅仅丢弃提交记录,但是该次提交的已修改的文件不会变动,这个适用于合并两个分支时,两个分支都有变动,那么在合并的时候git
会自动创建一个提交记录,记录本次合并。如果没什么冲突,为了简洁,可以把这个自动创建的提交记录丢弃掉。
drop
, 顾名思义,丢弃,不仅丢弃提价记录还丢弃添加或者文件内被修改的内容。
注意,倘若你已经git push到上游了,那就不要修改提交记录了,会造成混乱。这只适用于本地修改完,但还未push的时候。