Git(标签、分支和合并)2
合并分支
git merge
命令用来在 git 中合并分支:
$ git merge <other-branch>
发生合并时,git 将:
- 查看将合并的分支
- 查看分支的历史记录并寻找两个分支的 commit 历史记录中都有的单个 commit
- 将单个分支上更改的代码行合并到一起
- 提交一个 commit 来记录合并操作
合并有以下两种类型:
-
快进合并
–要合并的分支必须位于检出分支前面
。检出分支的指针将向前移动,指向另一分支所指向的同一 commit
。 -
普通类型的合并
– 两个完全不同的分支被合并,创建一个合并 commit
。
主题分支
(例如 sidebar)的作用是让你做出不影响 master 分支的更改
。当你在主题分支上做出更改后,如果觉得不想要该分支上的更改,则可以删掉该分支,或者你决定要保留更改,则可以将该分支上的更改与其他分支上的更改合并。
git 可以自动将不同分支上的更改合并到一起。这种分支和合并功能正是 git 的强大之处!你可以在分支上做出小的或大的更改,然后使用 git 合并这些更改。
理论原理
如上图所示,假设我们要将 master
和 sidebar
分支合并(merge
)起来。当合并发生时,它会进行提交。由于 HEAD 指向 master 分支,合并提交将被放置在 master 分支上,它将向前移动。
我们将 sidebar
合并到 master
,这不会影响 sidebar
分支。我们可以重新切换到 sidebar
分支,仍然对其进行提交。
假设我们有一个 social-links
分支,比 master
分支靠前一点。master
分支中尚不包含 social-links
提交,如果要将这些提交纳入到 master
分支,就需要将 social-links
分支并入 master
分支。
由于 HEAD 指向 master
分支,进行合并后 master
分支将会移动,而且由 social-links
分支比 master
靠前,GIT 会做一个所谓的 “快速合并”
。
注意,当你要合并分支时,务必知道当前位于哪个分支上。合并分支会提交 commit
。
快进合并
因为 footer
直接在 master
前面,因此这种合并最简单。将 footer
合并到 master
中将导致快进合并(Fast-forward merge
)。快进合并将使当前检出的分支向前移动,直到它指向与另一个分支(这里是 footer
)指向的 commit 一样为止。
进行普通合并
因为合并的是两个完全不一样的分支,因此将提交 commit。在进行 commit 时,需要提供 commit 消息。因为这是合并 commit,因此已经提供了默认消息。你也可以更改消息,但通常都会直接使用默认的合并 commit 消息。因此当你的代码编辑器打开并包含该消息时,直接关闭编辑器以确认使用该 commit 消息。
合并冲突
大部分情况下,git 将能够成功地合并分支。但是,有时候 git 无法完全自动地进行合并。合并失败时,就称为合并冲突。如果出现合并冲突,git 将尝试尽可能合并多的内容,然后将留下特殊选项(例如 >>>
和 <<<
),告诉你需要从何处手动修复。
合并冲突指示符解释
编辑器具有以下合并冲突指示符:
-
<<<<<<< HEAD
此行下方的所有内容(直到下个指示符)显示了当前分支上的行
-
||||||| merged common ancestors
此行下方的所有内容(直到下个指示符)显示了原始行的内容
-
=======
表示原始行内容的结束位置
,之后的所有行(直到下个指示符)是被合并的当前分支上的行的内容 -
>>>>>>> heading-update
是要被合并的分支
(此例中是 heading-update 分支)上的行结束指示符
解决合并冲突
git 使用合并冲突指示符来告诉你两个不同分支上的哪些行导致了合并冲突,以及原始行是什么。要解决合并冲突,你需要:
- 选择保留哪些行
- 删掉所有带指示符的行
删掉所有包含合并冲突指示符的行并选择保留哪个标题后,直接保存文件,并将其添加到暂存区,然后 commit!就像普通合并一样,代码编辑器会弹出,并让你提供 commit 消息。和之前一样,我们经常会使用自动生成的合并 commit 消息,因此在编辑器打开后,直接关闭编辑器并使用自动生成的 commit 消息。
当相同的行在要合并的不同分支上做出了更改时,就会出现合并冲突
。git 将在合并途中暂停,并告诉你存在冲突,以及哪些文件存在冲突。要解决文件中的冲突:
- 找到并删掉存在合并冲突指示符的所有行
- 决定保留哪些行
- 保存文件
- 暂存文件
- 提交 commit
注意一个文件可能在多个部分存在合并冲突,因此检查整个文件中的合并冲突指示符,搜索 <<<
能够帮助你找到所有这些指示符。
上一篇: 持续集成工具是怎样工作的?