git小技巧
1、git rebase —onto
把某个分支的某一段commit记录rebase到基点分支上
2、idea中git rebase的各参数的含义
C分支:当前分支(必须是分支)
A分支:基点(可以是分支,也可以是commit节点)
B分支:起点 (可以是分支,也可以是commit节点, 如果是commit节点,就找到当前分支最新commit跟这个起点commit节点之间所有的节点,rebase到基点上, 这个起点必须在当前分支上,如果不在,那么这个起点就没有意义了,就相当于直接把C分支rebase到A分支上)
对应着idea中参数的解释
3、idea中git rebase -i
合并一个分支中多次commit提交
合并1,3这两次commit
注:第一个commit的action不能是squash、fixup,最好是pick。
大致介绍一下每个action的含义
第一类:保留commit,不合并
pick: 标记为pick的commit会在rebase操作后会直接保留下来,不做任何改动,也不会合并,最上面的commit最好标记为这一类
reword: 这一类commit也会保存下来,不过在保存下来之前会有一次修改commit message的机会
edit:这一类的commit也会直接保存下来,不过,当合并到这种类型的commit时,整个合并经常会暂停下来,你可以重新修改这次commit中的变动内容,比如给这个commit继续新增一些代码改动、或者修改commit message,然后git add(不要忘记 git add了), 再继续使用git rebase —continue,来继续rebase操作。
第二类:不保留commit,与上一次commit合并
squash: 标记为squash的commit在rebase操作完成后不会保留,它会与之相邻的上一次commit进行合并。同时它的commit message也会与上一次commit的message合并。
fixup: 这类commit不会保留,会直接与相邻的上一次commit合并,与squash不同之处在于,它的commit message回直接丢弃,即这次commit会被视为对前一次commit的一次小的补充修改(fixup),commit message就以前一次为准
第三类:不保留,直接删除commit
skip:标记为skip的commit会直接被删除,就相当于这次commit从来没有发生过。同时,这个commit中涉及的所有代码修改全部会被删除。
skip举例(重要!!):
commit1: 新增一个test.txt文件,并插入一条记录a
commit2: 新增一个test_2.txt文件,并插入一条记录b
commit3:新增一个test_3.txt文件,并插入一条记录c
然后我们来rebase合并这三次commit,保留1和3 , skip2,看看结果会怎样?
结果:
commit2中涉及到的所有改动全部被删除了,test_2.txt删除了,只留下test.txt和test_3.txt。