文章目录
有时在一个分支上完成一个功能的开发,开发完成后需要将其合并到主分支中。或者有时提交了很多个commit,它们之间的改动并不是很多,想将它们合并成一个commit,此时就需要使用GIT的合并操作。下面来介绍一下GIT中的几种合并操作:
1 git merge和git rebase
git merge
不对仓库历史做任何改变,它会保留分支上所有的历史commit,然后简单地创建一个合并的commit。
1.1 git merge
**使用
git merge
将
master
分支合并到
feature
分支**
git checkout feature
git merge master
上面的操作会在
feature
分支上产生一个新的commit,它是
c4
和
c7
的合并为
c8
,
c8
包含了
master
分支上的所有修改,结果如下图所示:
快速模式
- 若在建立
feature
分支后主分支没有任何commit,则此时会使用Fast forward
模式进行merge,即不会产生一个新的commit,而是直接将main
分支的指针指向feature
分支 - 取消快速模式,需要添加选项
--no-ff
1.2 git rebase
**使用
git rebase
将
master
分支合并到
feature
分支**
git checkout feature
git rebase master
rebase将
feature
分支的基移到
master
分支的开头(即
c4
),将所有的新提交合并到主分支中。与在
feature
分支中创建合并提交不同,rebase通过在
feature
分支中为每个commit创建全新的commit来重写提交历史,
*c5
、
*c6
、
*c7
是在
feature
分支上的新commit。换句话说,就是**在
c4
的基础上,依次重新提交在
feature
分支上的每一次修改**。
可以看到提交是线性的,我们可以回溯从
feature
分支顶端开始到
master
分支的第一次提交的任何提交。rebase不会创建不必要的合并提交,因此,项目的提交历史将更清晰,更容易被其他开发人员理解。
- 注意:不建议在公共分支(
master
分支)上执行rebase合并,这会创建不同的master
分支。当然你也可以同步这两个不同的master
分支,然后merge为一个,但是这会导致重复提交,从而让主分支的commit十分混乱。
1.2.1 rebase交互模式
要想使用交互模式,在
rebase
命令后加上
-i
或
--interactive
选项即可。
git rebase -i [start][end]
- end可省略,默认为HEAD。其中start为开区间,end为闭区间。
例1:合并近三次的commit
git rebase -i HEAD~3
此时会弹出一个文本编辑窗口,前三行即最近三次的commit
pick 344a29d test1
pick 36f77fe test2
pick 88cb498 test3
常用选项如下:
p, pick = use commit
s, squash = use commit, but meld into previous commit
f, fixup = like "squash", but discard this commit's log message
d, drop = remove commit
由选项可知,将最前面的
pick
设置为
squash
或
fixup
即可压缩分支,和接下来要用到的
--squash
类似,但这里可以指定任意个数的commit进行合并。我们的目标是合并近三次commit,所以将第2、3行的前面的
pick
改为
s
或
f
即可。
注意:在合并过程中若发生冲突,需要自己对比修改本地文件,解决完冲突后执行:
git add .
git rebase --continue
如果中途不想合并了,则可以执行:
git rebase --abort
例2:删除某个commit
同理,如果想删除某个commit,将最前面的
pick
改为
drop
即可。
1.2.2 git pull --rebase
git pull
:先git fetch
再git merge HEAD
git pull --rebase
:先git fetch
再git rebase HEAD
从远程拉取代码后会与本地的代码进行合并,由上面的原理可知,使用
git merge
拉取最新的另一个分支的commit后,还会多产生一个合并的commit;而
rebase
则直接在拉取最新的commit后,即在当前本地分支的基础上,应用远程最新分支的修改,在当前分支上产生一个commit,不会有多一个commit。
2 git squash
在
git merge
中,每一次merge就会产生一个额外的commit,如果在工程中有许多bug和一些微小改变的commit,那么可以使用
--squash
选项将
feature
分支中的所有commit取出,然后压缩这些commit为一个并加入到
master
分支中。
具体指令如下:
git checkout master
git merge --squash feature
- 注意:上述的合并命令并不会创建一个commit,实际上就是将
feature
中的每一次commit的更改应用到本地,所以还需要手动提交该commit:git commit -m <"your commit message">
合并结果如下:
版权归原作者 tilblackout 所有, 如有侵权,请联系我们删除。