在平时的开发中避免不了使用 git 来管理代码,尤为是多人协做开发时更是如此。git 使用很差轻则一堆乱七八糟的追踪,重则 git push --force 覆盖队友代码(那些年的强制推送与删库跑路),这一篇主要介绍一下代码合并的两个重要命令,git merge
与 git rebase
。git
master 分支内容以下bash
index.text
// 内容
matser-1 // commit 内容 master-1
master-2 // commit 内容 master-2
master-3 // commit 内容 master-3
复制代码
feature 分支内容以下app
index.text
// 内容
matser-1 // commit 内容 master-1
master-2 // commit 内容 master-2
|-- feature
| |-- index.text
// index.text 内容
feature-1 // commit 内容 feature-1
feature-2 // commit 内容 feature-2
复制代码
首先咱们切到 master 分支,而后在控制台运行 git merge feature
命令。spa
这里就是 commit 的信息了,咱们修改成 master-4,而后保存。而后再查看 git 记录会发现以下图。3d
git merge feature 会从重现 feature 分支上作的更改,从 master-2 到 feature-2,而后将其结果记录成一个新的 commit 保存到 master 分支,同时也会以另外一条线记录 feature 分支的提交记录。code
若是咱们不想有这么杂乱的提交,只想保持一个干净整洁的记录,并且也不须要 feature 分支的提交记录,那么咱们可使用一个参数 --squash,这个参数能够帮助咱们压缩分支线。cdn
首先还原到上次提交: git reset HEAD^
blog
而后再删掉从 feature 分支 merge 过来的文件,再 merge 一下:git merge feature --squash
,因而就有了下图的结果。ip
而后 git status
查看。开发
再 git commit -m 'master-4'
提交。
这样就达到了咱们想要的效果了。
在使用 rebase 以前咱们也仍是切换回到上一次提交,git reset HEAD^
,删除多余的文件,而后切换到 feature 分支,git reset HEAD^
回到 feature-1 的提交。
此时 master 分支的提交是 master-一、master-二、master-3;feature 分支的提交是 master-一、master-二、feature-1。而后如今要在 feature 上开发 feature-2,可是缺乏了一个 master-3 的提交。
经过 rebase 来将 master-3 给拉下来。
输入命令 git rebase master
,而后看 git 的提交记录。
神奇的事情发生了,master-3 竟然出如今了 feature-1 前面,这是为何?
git-rebase - Reapply commits on top of another base tip
当前分支在其余目标分支基础上从新提交,通俗地讲就是先讲 feature-1 提交“取出来”,而后同步 master 分支,再讲 feature-1 提交“放回去”。
此时咱们再加入 feature-2,git add feature/index.text
,git commit -m 'feature-2'
,就获得了下图所示的结果。
咱们合并到 master 分支,git checkout master
,git rebase feature
。
为了更明显一点,咱们在 master 分支 rebase 前再进行一个 master-4 的提交。
在 master 分支里的根目录 /index.text 里新增一行 master-5,而后 git add index.text
、git commit -m 'master-4'
,获得以下结果:
而后 git rebase feature
这里就至关于把 master-4 提交先“取出来”,而后同步 feature 的提交到 master,再将 master-4 的提交“放回去”。最后获得上图的结果,追踪了全部的提交,而且分支树也是干净整洁的。
总的来讲,git merge 是从两个分支分离的时候开始合并,而后将功能分支的提交重现到主分支上,造成新的提交,同时也会在分支树造成枝叶来记录功能分支的提交,能够经过 --squash 参数来压缩。
git rebase 则是会先“取出”当前提交,再改变原有的分支基础(会将两个分支分离的地方进去往前的推动,达到同步),最后再将新的提交给“放回”到同步后的提交上。不会产生新的提交记录,也不会歪曲分支树。
如何选择哪种方式呢?
这里我在工做中的 git 结构是
因而就有了如下的选择:
feature 分支上有大量杂乱细小可有可无的提交,在功能完成后,咱们须要整合到一个 commit 提交给 develop 分支。
1. 基础