合并

把两个分支合并到一块儿。你为了新想法,新功能,或者修复项目的 bug 创建了一些分支,最终你还是希望把这些分支合并到主分支上。Git 有几种合并算法,Fast-Forward 合并,3-Way 合并。

git merge 分支

练习

1,Fast-Forward 合并练习。介绍分支的时候我们创建了一个新分支叫 smiley-face,在这个分支上做了一次提交。这期间在主分支(master)上没发生什么变化,也就是没在主分支上修改项目,没做提交,也没有合并其它的分支。这样我们在把 smiley-face 分支合并到 master 分支上的时候,就会是一个 Fast-Forward 合并。

先把当前分支切换到 master,执行:

git checkout master

观察项目里的文档,现在文档里面还没有我们在 smiley-face 上做的修改,也就是在文档里添加的笑脸符号。然后去合并 smiley-face 分支,执行:

git merge smiley-face

返回:

Updating 2b9a260..546fc18
Fast-forward
 README.md    | 2 +-
 resources.md | 2 +-
 2 files changed, 2 insertions(+), 2 deletions(-)

显示了一个 Fast-forward,表示这次合并是一次 Fast-forward 合并。查看项目的 master 分支上的历史:

→ git log --oneline -n 3

546fc18 在文档中添加笑脸符号
2b9a260 去掉文档中的笑脸符号
fd3acec 在说明文档里添加流程章节

最近的 “在文档中添加笑脸符号” 这个提交,是我们在 smiley-face 分支上做的,在 master 分支上合并了这个 smiley-face 分支以后,这些提交你都可以在 master 上找到。

2,合并时使用 --no-ff,表示不使用 Fast-forward 合并,这样可以在历史里记录一下合并动作。先重置一下 master ,抹掉合并以后加进来的提交:“在文档中添加笑脸符号”,执行:

git reset HEAD~1 --hard

现在 master 的历史会是:

→ git log --oneline -n 3

2b9a260 去掉文档中的笑脸符号
fd3acec 在说明文档里添加流程章节
e648ade 在相关资源里添加一个资源列表项目

重新再去合并一下 smiley-face,这次合并的时候用一个 --no-ff 选项,执行:

git merge smiley-face --no-ff

返回:

Merge made by the 'recursive' strategy.
 README.md    | 2 +-
 resources.md | 2 +-
 2 files changed, 2 insertions(+), 2 deletions(-)

提示合并用了 recursive 策略。用了 --no-ff 选项以后,在合并的时候会做一次新的提交。再这样查看一下历史:

git log --oneline --graph

显示:

→ git log --oneline --graph
*   981ec29 Merge branch 'smiley-face'
|\  
| * 546fc18 在文档中添加笑脸符号
|/  
* 2b9a260 去掉文档中的笑脸符号
* fd3acec 在说明文档里添加流程章节

加上 --graph 选项查看历史,会为你标记出使用 --no-ff 选项以后的合并。

→ git log --oneline -n 3
e35e925 Merge branch 'smiley-face'
546fc18 在文档中添加笑脸符号
2b9a260 去掉文档中的笑脸符号

3,练习 3-Way 合并。再去重置一下 master 分支,执行:

git reset HEAD~1 --hard

现在的 master 的历史会是:

→ git log --oneline --graph

* 2b9a260 去掉文档中的笑脸符号
* fd3acec 在说明文档里添加流程章节
* e648ade 在相关资源里添加一个资源列表项目

然后我们在 master 分支做点提交,假设现在有个 bug 或者功能急着要,你可以基于 master 去创建一个新的分支,在上面去修复 bug 或添加新功能,完成以后把它们合并到 master 上。

这里我们直接修改一下 master 分支下的东西。修改 README.md,像这样:

# Git
一本关于 Git 的书。

## 流程

---
by ninghao.net

然后做一次提交:

git commit -am '在说明文档底部添加内容作者'

现在,再去合并一下 smiley-face 分支:

git merge smiley-face

在合并的时候虽然没用 --no-ff,但是也会提交我们要做一次合并提交,因为 Git 现在不能做 Fast-forward 提交。

Auto-merging README.md
Merge made by the 'recursive' strategy.
 README.md    | 2 +-
 resources.md | 2 +-
 2 files changed, 2 insertions(+), 2 deletions(-)

查看一下合并之后的历史:

→ git log --oneline --graph

*   8d26980 Merge branch 'smiley-face'
|\  
| * 546fc18 在文档中添加笑脸符号
* | 907acdc 在说明文档底部添加内容作者
|/  
* 2b9a260 去掉文档中的笑脸符号

再像这样查看一下历史:

→ git log --oneline

8d26980 Merge branch 'smiley-face'
907acdc 在说明文档底部添加内容作者
546fc18 在文档中添加笑脸符号
2b9a260 去掉文档中的笑脸符号

4,删除分支。smiley-face 这个分支完成了它的任务,在上面做的提交现在也都合并到了 master 分支上了。现在我们可以把 smiley-face 分支删除掉。执行:

git branch -d smiley-face

返回:

Deleted branch smiley-face (was 546fc18).

查看分支列表,smiley-face 已经不见了。

results matching ""

    No results matching ""