如今假设咱们有一个主分支 master 及一个开发分支 deve,仓库历史就像这样:git
初始仓库历史fetch
如今若是在 master 分支上 git merge deve
:Git 会自动根据两个分支的共同祖先即 e381a81
这个 commit 和两个分支的最新提交即 8ab7cff
和 696398a
进行一个三方合并,而后将合并中修改的内容生成一个新的 commit,即下图的 78941cb
spa
merge 合并图code
rebase 是什么状况呢?仍是一个初始的仓库历史图:ip
rebase初始仓库历史开发
若是是在 master 分支上 git rebase deve
:Git 会从两个分支的共同祖先 3311ba0
开始提取 master 分支(当前所在分支)上的修改,即 85841be
、a016f64
与 e53ec51
,再将 master 分支指向 deve 的最新提交(目标分支)即 35b6708
处,而后将刚刚提取的修改依次应用到这个最新提交后面。操做会舍弃 master 分支上提取的 commit,同时不会像 merge 同样生成一个合并修改内容的 commit,至关于把 master 分支(当前所在分支)上的修改在 deve 分支(目标分支)上原样复制了一遍,操做完成后的版本历史就像这样:rem
rebase 合并图同步
能够看见 master 分支从 deve 分支最新提交 35b6708
开始依次提交了本身的三个 commit(因为是提取修改后从新依次提交,故 commit 的 hash 码与上面的85841be
、a016f64
、e53ec51
不一样)hash
rebase 操做加上 -i
选项能够更直观的看见被提取的 commit 信息。
仍然在 master 分支上 rebase deve 分支,不过此次要加上 -i
选项,即 git rebase -i deve
,而后咱们能够获得这样一个文本信息框it
rebase -i信息
f9a7673
与 edb2ba2
),会链接到目标分支的哪一个 commit (9c86a5c
)后面。能够根据 B 区域中的命令说明修改 pick
为其余命令,对该次提取出来的 commit 作额外的操做:wq
保存退出后,就会按照刚刚在 A 区域内设定的命令处理 commit 并 rebase。git rebase --continue
继续,或者 --skip
跳过(注意此操做中当前分支的修改会直接覆盖目标分支的冲突部分),亦或者 --abort
直接中止该次 rebase 操做merge --no-ff
与 merge --ff-only
的区别上面对 merge 的讲述都是基于其默认操做即 --no-ff
(git merge xxx
= git merge --no-ff xxx
)的说明,可是 merge 还有一种经常使用的选项 --ff-only
,那么这两种有什么区别呢?
--no-ff
是 merge 的默认操做,三方合并并提交修改;而 --ff-only
会判断当前分支能否根据目标分支快速合并,就像下面这样
快速合并
此时 deve 分支就可与 master 分支快速合并。
在 deve 分支上 git merge --ff-only master
,便获得合并完成后的版本历史图
快速合并完成
能够发现 --ff-only
生成的历史记录和 rebase 十分类似,可是本质上 --ff-only
仍然是合并操做,但 rebase 并无作合并,仅仅是提取修改到目标分支后面。
git help <command>
查看--no-ff
默认操做,生成一个对回顾提交历史并不友好的合并记录,仍是采用 --ff-only
方式git fetch + git merge --no-ff
两个操做,能够经过加上 --rebase
命令将 fetch 后的 merge 操做改成 rebase 操做,或者仅仅 'git fetch remoteName',而后才思考采起哪一种整合策略 git merge(or rebase) origin/master
git stash
命令暂存做者:不在服务区 连接:http://www.jianshu.com/p/c17472d704a0 來源:简书 著做权归做者全部。商业转载请联系做者得到受权,非商业转载请注明出处。