新建分支同时切换到新分支上

$ 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 完成了合并

然后在这次合并基础上修改了几个文件(冲突文件)

修改完暂存提交完事