工作中,刚开始我对 merge 和 merge --no-ff 这2个指令的区别有所不解,下图很好展示了这2个指令的不同(如果你平时用可视化工具管理代码可略过)
git add .git commit -m [很大]------ 比如当前我在自己的dragon分支,commit一些东西- ……省略
git pull----- 比如我现在在dev分支,pull完最新的代码- ……省略
git rebase dev---- 比如我切换到dragon分支,把最新一版的dev代码rebase到现在的分支git checkout dev----- 切换到dev分支git merge --no-ff dragon----- 把dragon分支merge到dev上。为什么merge要加--no-ff呢?--no -ff可以保存你之前的分支历史,保留分支的commit历史以及生成一个回顾提交历史,能够更好的查看merge历史,以及branch 状态。git merge则不会显示dragon分支所commit的历史内容不方便查看,只保留单条分支记录,如果不加--no-ff则被合并的分支(dragon)之前的commit都会被抹去
merge和rebase 这2个操作都是合并的意思,他们的区别下面只是代表本人浅意识的理解
合并的时候,有可能会产生代码重叠。重叠的产生是因为在多人开发模式下在合并代码的时候,不同开发人员的不同分支修改了相同的位置。所以在合并的时候git不知道那个到底是你想保留的,所以就提出疑问(重叠提醒)让你自己手动选择想要保留的内容,从而解决重叠。
-git rebase 命令合并分支,如果有重叠且解决完重叠,执行git add . 和 git rebase --continue,不会产生额外的commit。这样的好处是,‘干净’,分支上不会有无意义的解决分支的commit。
rebase 遇见重叠后会暂停当前操作,操作人可以选择手动解决重叠,然后 git rebase --continue 继续,或者 --abort 直接停止该次 rebase 操作(--abort 我是暂时没用过)
-git merge 命令合并分支,如果有重叠并且解决完重叠,执行git add . 和 git commit -m [fix],这个时候会产生一个commit。merge遇见重叠后会直接停止,等待手动解决重叠并重新提交 commit 后,才能再次 merge,merge命令不会保留被merge的分支(比如上面的dragon)的commit。
总结
- 当分支有修改未
commit时,不能进行 rebase 操作,可以考虑先用git stash命令暂存 - rebase 并没有进行合并操作,只是提取了当前分支的修改,将其复制在了目标分支的最新提交后面
- rebase 的提交历史反映了项目过程中发生了什么,关注点在开发过程上面
- merge 是一个合并操作,会将两个分支的修改合并在一起,默认操作的情况下会提交合并中修改的内容
- merge 的提交历史忠实地记录了实际发生过什么,关注点在真实的提交历史上面
结语
前端react QQ群:
788023830----React/Redux - 地下老英雄前端交流QQ群:
249620372----FRONT-END-JS前端(我们的宗旨是,为了加班,为了秃顶……,仰望大佬),希望小伙伴们加群一起学习