一个主分支肯定是不够用的,不同的开发最好放在不同的分支上,在最后进行合并,不然在开发中会相互干扰。
PS:环境Window xp,Git-1.8.4-preview20130916(http://git-scm.com/)
Git中默认的分支即:master。
1、想在master基础上创建新分支(关键命令:branch):
git branch new_branch_name master
2、虽然成功创建了新分支,但是当状态还是master分支,因此需要切换到新分支(关键命令:checkout):
git checkout new_branch_name
3、如果想一步完成上面的1和2操作(通常创建分支后就会切换到新分支进行编码)(关键命令:checkout,关键参数:-b):
git checkout -b new_branch_name master
注意分支名称不能重复哦!
4、想查看目前版本库中有哪些分支:
git branch
5、想重命名已有分支(master为原分支名称,mymaster为新名称)(关键命令:branch,关键参数:-m):
PS:如果将小写m改成大写M会很危险的哦,如果已经存在mymaster分支,则会被强制覆盖的哦!!!
git branch -m master mymaster
6、如果不需要某分支了,那么删除它即可(关键命令:branch,关键参数:-d):
PS:删除前需要切换到其它分支下哦。
PPS:如果通过-d删除时,提示无法删除,则可能是由于当前分支未合并到其它任何分支(即你当前分支的提交条目会被彻底删除)等等原因,如果确认了删除了也没关系的话,就用-D参数来强制删除吧。
git branch -d new_branch_name
7、一般情况,分支最终会被合并,分支的合并:
据说分支合并有好几种方法,这里就先写上参考的书上所罗列的三种,日后有机会补充。
(1)直接合并(straight merge):将一条分支直接合并到另一条分支(即把所有历史提交合并过去),如果合并时没有冲突,当前合并会自动提交到版本库(提交的注释是带merge字样的),如果出现冲突,则需要手动编辑冲突的文件(命令行会提示哪些冲突),然后手动提交。(PS:直接合并在分支图上的展现方式是两条分支线汇合到其中一条分支线上!)命令如下(将new_branch_name合并到当前分支上)(关键命令:merge):
git merge new_branch_name
(2)压合合并(squashed commits):将一条分支上的历史提交压合成一条提交条目,提交到另一条分支的末梢,但不提交(不管有无冲突),需要手动来进行提交。(PS:压合合并在分支图上展现不出有合并的迹象,毕竟是把另一条的历史提交合并成一条了)命令如下(将new_branch_name的历史提交压合到当前分支上)(关键命令:merge,关键参数:--squash):
git merge --squash new_branch_name
(3)拣选合并(cherry-picking):拣选另一条分支上的部分提交条目到当前分支上。(PS:该合并在分支图上也无法展现出合并的迹象。)拣选时可以只拣选一条提交条目,也可以多条,因此操作方式稍有不同:
1)拣选一条,并自动提交到当前分支:(关键命令:cherry-pick,关键参数:单次提交的名称,是一个SHA-1哈希码,共40位,只取前7位即可。)
git cherry-pick 321d76f
2)拣选多条提交条目,然后需要手动提交了(关键命令:cherry-pick,关键参数:-n):
git cherry-pick -n 321d76f
8、冲突处理:在合并过程中随时可能发生冲突,那么就需要在提交前,解决冲突(不要告诉我,你发现冲突了,却没有理会它……),冲突的内容会以特殊格式的符号标识出来。一般如下:
<ul> <li>a</li> <li>b</li> <<<<<<< HEAD <li>c</li> ======= <li>C</li> >>>>>>> new_branch_name </ul>
上述内容中,冲突部分相关内容在<<<<<<<和>>>>>>>中间,其中以=======作为分隔行(好像都是7个符号啊),表示两个不同分支的内容,前面的是当前分支内容,后面的是另一条分支的内容。其中>>>>>>>后面的HEAD表示当前分支的意思,表明其后的内容是当前分支的,>>>>>>> 后面的new_branch_name表示的是另一条分支的名称,表示其前面的是该分支下的内容。
既然知道这些符号的意思了,那么就可以手动编辑,之后记得手动提交修改完的代码啊。
虽然少数的冲突挺容易处理的,但是也存在复杂的情况,这时需要专门的工具了,在合并发生冲突时,运行如下命令来启动Git中配置的可视化合并工具:
git mergetool
默认情况下未进行任何配置,所以git mergetool会尝试扫描本地可用的合并工具(tortoisemerge emerge vimdiff等等。),当然前提是你安装了。
如果需要手动指定可视化合并工具,则可以在git配置文件中配置merge.tool参数,这个同配置username一样:(其中--global表示针对全局,即git的总配置,如果不加该参数,只针对当前版本库有效。)
git config --global merge.tool vimdiff
根据参考书上所说,通过合并工具解决重突后,Git会自动暂存修改(git add),等待提交,若提交时不用-m参数,Git会使用刚才合并操作相关信息来填充提交留言。
PS:可视化合并工具待有空去玩玩~ 现在其实都有可视化的Git工具了(SmartGit Hg,TortoiseGit),里面自动了可视化合并工具了,还是蛮方便的。
参考资料:
《版本控制之道—使用Git》ISBN:978-7-121-10719-1