git merge 和git rebase的区别
最近在学习git的版本控制,分支之间的同步、冲突处理,cherry-pick等有趣的功能。下面是整理的一些学习笔记。
一、git merge [branchName]
顾名思义,就是合并分支,比如你当前代码库有两个分支一个是master
,另一个是dev-feature
。(如下图)
我们在dev-feature 分支,想同步master的通用修改:
git checkout dev-feature git merge master
Git会按照修改的时间点将master分支的修改记录依次应用到dev-feature分支。 我们使用git log 可以看到修改记录依次为(从新到旧):C7←C5←C6←C3←C4←C2←C1。
二、git rebase [branchName]
按照字面意思立即就是变基,比如我们当前在dev-feature分支,执行**git rebase master
,Git会先找到new-feature分支和master的最近公共祖先(C2结点),然后把当前分支的后续修改**依次应用于master分支。
Git会把C4和C6节点回收,可以用git gc查看。
三、冲突解决
如果变基过程中发生冲突(比如我们修改了文件的同一行)!然后我们找到下图中标记的地方,修改代码解决冲突。 在rebase的过程中,也许会出现冲突(conflict). 在这种情况,Git会停止rebase并会让你去解决冲突;在解决完冲突后,用git add命令去更新这些内容的索引(index), 然后,你无需执行 git commit ,只要执行:
$ git rebase –continue
这样git会继续应用(apply)余下的补丁。 在任何时候,你可以用–abort参数来终止rebase的行动,并且"dev-feature" 分支会回到rebase开始前的状态。
$ git rebase –abort
同时我们查看版本树,发现正在将C2的修改应用于master分支的C3之上。 变基完成后
《全文完》