前言
本文参考自:
在 Git 中整合来自不同分支的修改主要有两种方法:merge
以及 rebase
我们先来接受一个观点:每一次提交就会保存一个快照,而分支其实就是一个指向快照的指针
一、merge
git-merge - Join two or more development histories together
将其他分支的提交历史合并到当前分支
假设有如下提交历史:
我们要合并master上修改
git checkout master
git merge iss53
这时,Git 会使用两个分支的末端所指的快照(C4
和 C5
)以及这两个分支的工作祖先(C2
),做一个简单的三方合并。
最后形成以下结果,实现提交的合并
二、rebase
1.rebase原理
git官网文档给出的定义
git-rebase - Reapply commits on top of another base tip
即在另一个基点上重新执行提交
假设有如下提交历史:
A---B---C topic
/
D---E---F---G master
然后我们执行 rebase 命令
git rebase master
则git将执行如下操作:
(1)首先找到这两个分支的最近共同祖先
E
(2)然后对比当前分支相对于该祖先的历次提交,提取相应的修改并存为临时文件
(3)接着将当前分支(topic指针)指向目标基底
G
(4)将临时文件中保存的提交重新应用一遍
最后形成以下结果,实现提交的合并
A'--B'--C' topic
/
D---E---F---G master
2.rebase使用场景
2.1 整合分支
假设有如下提交历史:
A---B---C topic
/
D---E---F---G master
我们正处于topic分支,要合并master上的更新
git reabse master
最后形成以下结果,实现提交的合并
A'--B'--C' topic
/
D---E---F---G master
2.2 合并多个commit
假设有如下提交历史:
A---B---C topic
/
D---E---F---G master
我们正处于topic分支,要合并master上的更新
git reabse -i master
会进入vim编辑器,我们将commit都合并到A中,形成新的commit D’
p A
s B
s C
最后形成以下结果,实现提交的合并
D' topic
/
D---E---F---G master
2.3 git pull
- git pull = git fetch + git merge
- git pull --rebase = git fetch + git rebase