Git Pro 第二版: https://www.gitbook.com/book/bingohuang/progit2/details
1. 分支简介
使用分支可以将当前工作从开发主线上分离出来。git 以快照的方式保存文件而不是文件补丁。每次进行一个提交操作时,Git会先计算每一个子目录的校验和,然后在Git仓库中将这些校验和(索引)保存为树对象, 随后Git创建一个提交对象。这个提交对象包含了父提交对象 树对象指针(树对象中包含着文件快照索引)和作者信息以及提交信息。
图中 箭头代表 指针的指向。
分支本质上就是指向提交对象的指针。可以通过特殊指针HEAD 来判断当前在哪一个分支上, HEAD 指针永远指向当前所在的分支。
2. 创建分支
$git branch <branch name>
创建分支后,git 并不会自动切换到新分支上
3. 分支切换
$git checkout <branch name>
使用 -b 选项创建并切换到新分支
$git checkout -b <branch name>
注意:切换分支的时候, Git 会重置工作目录,自动 添加 删除 修改 文件使之看起来和这个将要切换到的分支最后一次提交时的样子一模一样
4. 分支合并
切换到要合并到的分支上,运行:
$git merge <branch name>
分支合并有以下两种情况:
1) 快进
当合并上图中master分支和hotfix分支时,由于master分支所指向的提交是hotfix指向的提交的直接上游,所以Git 只需要将master分支(指针)移动到hotfix分支(指针)指向的提交即可。即如果顺着一个分支走下去能够到达另一个分支,那么Git在合并两者的时候只需要将分支(指针)向前移动即可,因为这种情况下合并操作并没有需要解决的分歧。这种情况就叫做快进(fast-forward)
2) 分叉合并
当合并上图中master分支和iss53分支时,两个分支在更早的地方分叉开来, git 需要将两个分支的末端C4 和 C5以及他们的共同祖先C2 合并。合并后结果如下:
当合并存在冲突时,Git 不会提交合并。运行 $git status 查看未合并的文件,解决冲突后 再 add, commit
5. 删除分支
$git branch -d <branch name>
对于未合并的分支可使用 -D 选项强行删除
$git branch -D <branch name>
6. 分支查看
查看当前所有分支, 分支名前 带* 的表示此分支为当前检出的分支
$gti branch
使用 -v 查看每个分支的最后一次提交
$git branch -v
使用 --merged 和 --no-merged查看已经合并和未合并到当前分支的分支。
$git branch --merged
$git branch --no-merged