参考链接:https://www.cnblogs.com/michael-xiang/p/13179837.html
学习背景:已经学习过git,但是实践较少,未和他人协作
1.merge
git merge表示把当前分支合并到版本库中下拉的远程分支上。
git merge A B表示把A分支合并到B上。
1.1 fast forward合并
合并说明:
-
fast forward合并指合并两个没有分叉的分支。
-
合并效果是高版本分支替换低版本分支,低版本分支的HEAD指针指向高版本分支最新的提交。
举例:
多人合作项目,自己请假回家多日未工作。同事已经提交了好几个版本的新代码。请假结束后,使用git pull下拉最新代码,因为自己仓库版本是远程仓库的老版本,即没有分支。那么下拉会使用fast forward合并,覆盖自己所有代码。如果同事修改过你的代码,那么你下拉后会变成同事修改的版本。
图示举例:
feature是远程仓库的分支
master是本地仓库的分支。对比发现本地分支没有未上传远程仓库的提交,因为远程仓库有d2falae的提交,这是本地仓库最新提交
使用git merge合并,先尝试fast forward合并,合并成功,将本地master分支合并成了远程feature分支,本地HEAD指向和feature分支一样的41bd1d9提交
1.2 no fast forward合并
合并说明:
-
no fast forward合并指合并两个有分叉的分支。
-
合并效果是在高版本分支上新创建一个提交记录,表示低版本分支的修改,之后高版本分支替换低版本分支,低版本分支的HEAD指针指向高版本分支最新的提交。
举例:
多人合作项目,自己写的代码已经提交,但是未上传远程仓库。同事已经提交了好几个版本的新代码,并且你们没有共同修改相同的文件。此时用git pull下拉最新代码,此时你的分支和同事的分支发生了分叉,分叉部分就是你未上传远程仓库的提交。那么下拉会用no fast forward合并,在远程仓库的新分支上新建一个提交,表示在新分支上合并你的提交。
图示举例:
feature为远程分支,master为本地分支,本地分支有未上传的提交,无法用fast forward合并
使用git merge会先尝试fast forward合并,失败后会使用no fast forward合并,可以看见新创建了一个提交e0c3d77表示将master最新提交3793081和feature最新提交41bd1d9合并的结果
2.rebase
git rebase表示把当前分支作为基,让版本库中下拉的远程分支向前移植。
git rebase A B表示把A分支作为基,让B分支向前移植。
变基说明:
- 使用rebase指定基分支和目标分支,之后找到基分支和目标分支的最近公共祖先,远程分支不变。从最近公共祖先开始,将目标分支在最近公共祖先后的提交插入基分支后最新提交之后,目标分支在最近公共祖先后的每个后续提交都发生了更新。这样让远程分支的基变成本地分支之后,相当于本地分支的最新提交和远程仓库的分支没有分叉,可以使用fast forward合并本地和远程分支。
图示举例:
feature为远程仓库分支,master为本地分支
使用git rebase,让本地分支master做基,远程分支feature前移