[基本概念] 
GIT branch 的本质是一个提交链表的指针。创建一个新的branch,实质是创建了当时提交链表的一个新指针。该指针和原指针独立操作,各自叠加新的提交后,形成各自的分支链。
“在分支上”的含义,新建一个分支之后,建立此分支以前的提交也称为在这个分支上。
HEAD的含义:当前branch。 随着git branch checkout <branch> 改变。
分支不是线形性:如果发生过merge,则即使 HEAD 相同,链表也不具有唯一性。(即某些提交有多父情况)
 
为什么要及时删掉不用的分支:防止提交查看时显示过多的分支。
merge 时,如果自动merge没有冲突,则 GIT 产生一个新的提交。如果有 冲突,则GIT产生一个未提交。
实践中,可以有三个分支:
1, master
2, dev
3, Topic:针对某个具体问题,短期存在,需要经常的rebase。
问题:如果删除一个分支,那么它上面的未 merge 的提交会一起删除吗?
[基本操作]
查看分支:                                       $ git branch
创建分支:                                      $ git branch mybranch
切换分支:                                      $ git checkout mybranch
创建并切换分支:                                $ git checkout -b mybranch
合并分支:(merge from)                          $ git checkout master
                                                $ git merge mybranch   (merge from mybranch)
使用 merge工具(有冲突的情况下):              $ git mergetool
删除分支:                                      $ git branch -d mybranch
强制删除分支 (上面有尚未 merge 的提交):        $ git branch -D mybranch
列出所有分支:                                  $ git branch
查看各个分支最后一次提交:                      $ git branch -v
查看哪些分支合并入当前分支(可以删了):        $ git branch --merged
查看哪些分支未合并入当前分支:                  $ git branch --no-merged
远程: 
更新远程库到本地:                              $ git fetch origin
如果有新分支,则分支名:orgin/<branch>
 
取远程分支合并到本地分支:                      $ git merge origin/mybranch
用远程分支建一个本地分支:                      $ git checkout -b mybranch origin/mybranch
推送分支:                                      $ git push origin mybranch
 
推送分支,并换个名字:                          $ git push origin serverfix:awesomebranc
删除远程分支:                 $ git push origin  :mybranch
 
rebase:                                         $ git checkout mybranch
                                                $ git rebase master    (rebase from master)
 
举例:                                          $ git checkout server
                                                $ git rebase --onto master server client
                                                $ git checkout master
                                                $ git merge client  (fostforward)
                                                $ git rebase master server  (checkout sever)
                                                $ git merge server
                                                $ git branch -d client
                                                $ git branch -d server
 
merge 和 rebase 的区别:
1),从文件结果看,merge 和 rebase 可以达到同样效果。 
2),从历史纪录看,他们存在差异:merge 显示合并后的多父结点,呈现环形, 而 rebase 呈现线性结果,即它对分支历史进行合并操作。rebase 提供更好的历史呈现方式(似分支从未曾发生过),但有风险。 掌握一条原则:Do not rebase commits that you have pushed to a public repository. 即,不要对你提交过的分支进行 rebase。因为本地的改变会造成远端的困惑。 
3), 在实践中,可以尽量用 merge,慎用 rebase。