git顶级特性
- git branch 分支名 创建一个新分支
- git log --oneline --decorate 查看各个分支/HEAD 所指向的对象,如何涉及到当前分支
- git checkout 分支名 切换分支, HEAD会指向当前分支
- git鼓励使用分支/合并,因为分支的创建和销毁的代价非常低
分支使用例子:
- 遇到新需求,可在master分支上创建新分支
- 这个新分支可以叫特征分支,独立开发
- 期间master上出现了紧急bug,需要在master上创建一个新分支
- 这个新分支可以叫bug分支,独立开发
- bug分支做完后,经过测试,可合并到master,并删除bug分支
- 继续开发特征分支,如果bug影响到新需求,此时可以将master合并到特征分支
- 如果bug不影响新需求,可以在特征分支开发完后,在将master合并进来
- 特征分支测试完后,合并到master分支,并删除
分支合并冲突:
- git status 可查看到冲突状态,需要手动将这些冲突解决
- 手动解决之后,需要使用git add 将冲突文件添加到暂存区,git会将他们标记未冲突已解决
- git mergetool 来启动一个图形化的解决工具,(本机配置的是vimdiff,具体用法可以后面单独开篇幅讲)
分支管理:
- 上面已经提到了分支的创建/合并/删除,下面进一步说明分支的进一步用法
- git branch 结果中的*表示HEAD指针指向的分支
- git branch -v 查看每个分支最后一次提交信息
基于分支的work flow,会衍生出一些典型的工作模式.
- 长期分支
- 鉴于分支合并便捷,多分支的存在很普遍,master分支一般只存完全稳定的代码
- 实际产品中,可能还有一个发布分支,用于跟踪已发布版本
- 大型项目可能为了稳定性,还有建议分支和建议更新分支,对应不同的稳定性
- 当一个项目非常庞大和复杂时,多个长期分支的分发很有帮助(但不是必要的)
- 特性分支
- 任何规模的项目都适用
- 一个短期分支,目标时完成某一特性,或是完成某一需求
- 特性分支可以快速切换上下文
远程分支:
- 对远程仓库的引用,包括分支和标签
- git ls-remote 简写 查看远程引用的完整列表
- git remote show 简写 获取远程分支的更多信息
- 要推送到远程分支,前提是在远程仓库上有写入权限,其次要手动推送
- git push 简写 本地分支名:远程分支名 推送本地分支到远程仓库的指定分支
- 如果远程仓库有某个分支,本地没有: git fetch 可同步到本地,但不会自动生成可编辑副本, git checkout -b xx origin/xx 可创建一个本地分支
- 如果本地有某个分支没有设置远端分支为上游分支, git branch -u origin/pro-git 即可
- 从远程跟踪分支checkout出的本地分支,会自动创建"跟踪分支"(跟踪的分支叫"上游分支")
- 跟踪分支,是和远程分支有直接关系的本地分支,git pull会自动识别去哪个服务器fetch/merge到哪个分支
- 最常见的跟踪分支是master
- git branch -vv 显示本地分支的跟踪情况
- 推荐使用git fetch + git merge, 因为git pull隐藏了很多信息
- git push origin --delete 分支名 删除远程分支
- 如果远程分支已删除,本地分支已删除,还存在fetch的远程分支,使用 git remote prune 简写 来删除不该存在分支
合并不同分支的方式有两种:一种是merge,一种是rebase.
- rebase被成为变基
- rebase有风险,单实现的功能和merge类似,指是历史好看一点