git的merge和rebase的使用方法
git分支合并
在工作开发时,常用git作为版本控制。开发的过程中,一般不在主分支上开发,会拉出一个功能分支(feature)进行开发。功能开发完成后,再通过git merge
把功能分支上的代码合并到主分支中。
有时我们在功能分支上提交了很多冗余的commit,我们想要把这些commit合并到一起,提交到主分支中。这时可以使用git rebase
命令,进行变基,把冗余的commit合并到一起。
merge
git merge的常用选项参数
git merge --abort
该命令仅仅在合并后导致冲突时才使用。
git merge --abort
将会抛弃合并过程并且尝试重建合并前的状态。但是,当合并开始时如果存在未commit的文件,git merge --abort
在某些情况下将无法重现合并前的状态。(特别是这些未commit的文件在合并的过程中将会被修改时)。git merge --ff
--ff
是指fast-forward命令。当使用fast-forward模式进行合并时,将不会创造一个新的commit节点。默认情况下,git-merge
采用fast-forward模式。git merge --no-ff
即使可以使用fast-forward模式,也要创建一个新的合并节点。这是当
git merge
在合并一个tag时的默认行为。git merge --squash
--squash
当一个合并发生时,从当前分支和对方分支的共同祖先节点之后的对方分支节点,一直到对方分支的顶部节点将会压缩在一起,使用者可以经过审视后进行提交,产生一个新的节点。
演示示例
创建一个仓库
1 | git init |
切出分支用于开发
1 | git checkout -b dev |
在dev分支中进行开发,并做提交。
1 | 更改文件 |
使用默认参数合并分支
1 | git checkout master |
1 | 更改文件 |
使用参数--no-ff
合并分支
1 | git checkout master |
命令执行后会出现修改commit信息的编辑框,如果不需要编辑,直接退出即可。
合并后的状态
演示合并冲突如何解决
1 | 更改文件 |
1 | git merge dev |
因为有冲突,合并失败,输出信息如下
1 | Auto-merging a.txt |
使用git status
命令,输出如下
这时需要我们手动解决缺陷,然后再提交
1 | git add . |
1 | git checkout -b dev2 |
使用参数--squash
合并分支
1 | git checkout master |
1 | git status |
1 | git commit -m "merge --squash" |
rebase
rebase的使用方法很多,这里只展示在合并时常用的做法,即把dev分支rebase到master分支上。
常用的命令做法是:在dev分支上,执行git rebase -i master
,即可把dev分支变基到master分支上。-i
命令表示可以编辑commit信息。可对commit做的编辑操作如下
命令 | 缩写 | 含义 |
---|---|---|
pick | p | 保留该commit |
reword | r | 保留该commit,但需要修改该commit的注释 |
edit | e | 保留该commit, 但我要停下来修改该提交(不仅仅修改注释) |
squash | s | 将该commit合并到前一个commit |
fixup | f | 将该commit合并到前一个commit,但不要保留该提交的注释信息 |
exec | e | 执行shell命令(不常用) |
drop | d | 丢弃该commit |
演示示例
初始化仓库
1 | git checkout -b dev |
开发好的dev分支
1 | git rebase -i master |
命令执行后出现如下编辑框,可以看到默认对commit的操作是保留所有commit
编辑之后如下,保留dev 1;合并dev 2, dev 3;修改dev 4;合并dev 5,dev 6,但是不波流commit信息,丢弃dev7 dev8,;保留 dev9
编辑,退出之后是这样
修改了 dev 4 reword的提交信息之后
出现这个,是有冲突
解决冲突,git add
合并完成之后的log git log
总结
git merge
:当需要保留详细的合并信息的时候建议使用,特别是需要将分支合并进入master
分支时
git rebase
:当发现自己修改某个功能时,频繁进行了git commit
提交时,发现其实过多的提交信息没有必要时使用,分支多,内容多时也可以考虑使用