10-git-6-merge

概述

git merge命令用于合并指定分支到当前分支

将develop分支合并到当前分支,当前分支会创建新的commit对象,它有两个父节点,分别指向当前分支和develop分支。

git merge develop

合并方式

非快进方式

假如此时在C1节点master分支上,创建了一个新的分支dev,然后在master分支创建新的提交C2,在dev分支上创建新的提交C3。

如果合并分支之前,master分支和dev分支都有了属于自己分支的独有提交,此时只能使用普通方式进行合并。

此时可以将master合并到dev,也可以将dev合并到master

以dev合并到master为例:

在maser分支执行git merge dev,会有新的变更进入到master,新变更进入后,master分支的内容会产生变化,因此master分支需要一个新的提交来对应变化后的状态,于是,master分支的指针会指向最新产生的合并提交。

而对于dev分支来说,并没有任何内容发生变动,所以dev分支的指针仍然保持原位。

fast-forward(快进)

假如此时在C1节点master分支上,创建了一个新的分支dev,然后在dev分支上创建新的提交C2。

如果合并分支之前,master分支和dev分支中只有一个分支创建了属于自己分支的独有提交,此时可以使用fast-forward进行合并。

由于基于maste分支创建dev分支以后,master分支中并没有产生任何新的提交,如果此时想要将dev分支合并到master分支,只需要将master分支的指针指向到dev分支的最新提交,即可让master分支包含dev分支中的所有新变更。即:

如果“指定分支”本身是当前分支的一个直接子节点,则会产生fast-forward合并,即合并不会产生新的节点,只是让当前分支指向“指定分支”的最新commit。

冲突

当我们合并分支的时候,如果当前分支和要被合并的分支在同一个地方修改了不同的内容,会发生冲突,自动合并失败,需要人为解决。

解决冲突

git会使用如下结构,将冲突的内容标注起来

git会将当前分支中的内容放在 “<<<<<<< HEAD” 与 “=======” 之间。

git会将合并分支中的内容放在 “=======” 与 “>>>>>>> new” 之间。

<<<<<<< HEAD

=======

>>>>>>> BranchName

当我们手动解决完之后,重新添加并提交即可。

放弃合并

当我们执行git merge --abort命令以后,git就取消了本次合并操作

git merge --abort

参数

--no-ff

明确指定不使用”Fast-forward”的模式进行合并

即使合并条件满足”Fast-forward”模式,也不使用快进的方式进行合并,而是使用创建合并提交的方式进行合并。

git merge --no-ff [branch]

--ff-only

当能使用”Fast-forward”模式合并时,合并正常执行,当不能使用”Fast-forward”模式合并时,取消合并。

git merge --ff-only [branch]

--squash

压缩提交记录,即将被合并分支的提交记录合并为一个

当dev分支上有多条细小琐碎的提交时,可以使用这种合并方式,将dev分支合并到master

这样master主分支上的提交记录会看起来比较清爽,缺点是不会保留原作者

git merge --squash [branch]

--no-edit

让合并提交直接使用默认生成的注释,默认注释为Merge branch ‘BranchName

git merge --no-edit [branch]

-m

合并提交自定义注释信息

git merge [branch] --no-ff -m "message"

推荐阅读

git合并策略