新建分支同时切换到新分支上
$ git checkout -b new-issue-61
# 应对现实情况是, 版本发布后有了新的需求, 新建分支开始实现
# 等同于下面两条命令
# git branch newIssue61
# git checkout newIssue61
创建分叉并切换至:
新分支提交后:
以前的提交版本有bug 需要修复(切换到以前的分支并新建分支, 修复后合并)
#去修复bug
$ git checkout master
$ git checkout -b hotfix
# 切换到旧的分支, 然后在那个位置新建一个分支来修复bug
# 修复完成后合并到旧分支
$ git checkout master
$ git merge hotfix
# 切换到一个分支, 然后把其它分支合并过来
# merge[mɜrdʒ] 结合 融入
# 如果不需要解决分歧, 那么合并分支旧是让master 和hotfix 两个分支保存同一个commit 对象
# 不解决分歧的合并是Fast-forward
# 合并后删除不需要的分支
$ git branch -d hotfix
# 然后就可以切换回满足新需求的分支继续工作了
有分叉时的合并情况
$ git checkout master
$ git merge iss53
# 把两个分支的最新快照(C3 和 C4)以及二者最近的共同祖先(C2)进行三方合并
# 合并的结果是生成一个新的快照(并提交)
# rebase 变基的姿势来合并分支
$ git checkout iss53 # 切换到小分支
$ git rebase master # 把当前分支(小分支)的所有提交都给主分支来一遍, 多线变成了单线
# 相当于对主分支进行了多次commit
$ git checkout master # 切换到主分支
$ git merge iss53 # 合并, 此时就是Fast-forward 合并了, 只是移动一下指针
# 两种分叉合并的优劣
快照合并可以有效的保存历史
变基合并可以减少"草稿"的数量
一般是在向远程服务器中提交代码时用一下, 避免把自己实现过程中建立的n 各分支都提交过去
这种分叉的分支合并后, 会有多个父commit 对象:
有冲突时的合并情况
不同的分支都修改了同一文件的同一行时, Git 就无法干净的合并它们了
此时Git 会暂停, 等待你解决冲突
Git 先合并到同一文件, 把此文件标识为unmerged
$ git status
On branch master
You have unmerged paths.
(fix conflicts and run "git commit")
Unmerged paths:
(use "git add <file>..." to mark resolution)
both modified: index.html
no changes added to commit (use "git add" and/or "git commit -a")
这个文件内部会把所有的修改都包含进来
<<<<<<< HEAD:index.html
<div id="footer">contact : email.support@github.com</div>
=======
<div id="footer">
please contact us at support@github.com
</div>
>>>>>>> iss53:index.html
手动修改这个文件, 并把那些冲突符号都删掉 <<<<<
=====
>>>>>
<div id="footer">
please contact us at email.support@github.com
</div>
可以选择可视化解决冲突的工具 git mergetool
, 会一步步的带领着帮助解决冲突
解决完冲突后, 把冲突文件暂存然后提交
总结有冲突的合并
相当于Git 完成了合并
然后在这次合并基础上修改了几个文件(冲突文件)
修改完暂存提交完事