Git使用手记
Git介绍
Git对比SVN
分布式版本控制与集中式版本控制
SVN在开发的过程中需要持续与中央服务器进行交互;
Git在每个电脑里都存了一份与远程服务器一样的数据,当我们提交代码的时候仅仅是为了同步数据;
安全性
SVN由于是集中版本控制,所有代码提交都直接影响了中央仓库,这就意味着问题代码会直接影响所有人的代码;
SVN中央库出现数据丢失会导致整个版本库都无法正常使用,而Git由于是分布式的工作不会受到影响;
分支功能
SVN创建分支其实是在另一个目录创建了一份新的目录,相当于拷贝了一份放到另一个目录下;
Git创建分支没有任何改变,可以快速的切换分支;
相同点就是分支都是独立的,不会互相影响。
SVN分支越多占用的空间越大(复制),而Git仅仅是创建了索引(占用容量小)
Git基础概念
Git数据模型
Git基本命令介绍
clone
将远程仓库复制到本地仓库
fetch
将远程仓库的更新复制到本地仓库
pull
将远程仓库复制到工作空间
checkout
将本地仓库检出到工作空间
add
将工作空间的修修改添加到暂存区
commit
将暂存区的修改提交到本地仓库
push
将本地仓库的修改提交到远程仓库
使用场景
更新代码
本地未做修改更新代码
直接使用pull命令
本地修改了部分代码但是还没改完
- 先使用commit命令将修改的代码放入本地仓库(或者将代码放入stash储藏)
- 然后使用pull命令
- 使用pull命令之后去stash中找到需要恢复的版本
开发新功能
- 首先从dev分支pull一个新分支到本地,分支命名参见分支命名规范,例如bug-1174468
- 切换到分支进行开发工作
- 开发完成后可以commit到本地仓库,是否push到远程仓库可根据需要来判断
- commit后即可进行合并操作
提交代码
提交时不需要合并
提交代码时使用commit命令提交到本地仓库,然后使用push命令进行提交
提交远程仓库时发现需要合并
- 提交代码到本地仓库
- 提交代码到远程仓库
- 提交到远程仓库时可能会提示 版本不一致如何处理?这个时候需要拉取远端代码到本地进行合并操作,使用pull的 merge或rebase操作
- 将本地仓库代码与远端仓库代码进行合并后再执行push操作
合并分支
开发完成后需要将分支上的代码合并到dev或master分支上
- 首先pull dev分支,使得本地的分支与线上的分支同步
- 切换到dev分支,使用合并分支操作将自己的代码合并到dev分支上
- push合并后的代码
开发新功能的过程中需要和dev分支保持同步
我们在开发新的功能时,dev也持续进行新的开发,在我们的分支上进行开发的过程中需要持续和dev分支保持同步。
合并方式同合并分支
一些概念理解
merge
合并,将本地仓库与线上仓库进行合并。将被合并分支上的修改C5、C6与C3、C4进行合并,生成C7版本提交
rebase
变基,以合并分支为基础。将被合并分支上的修改C3、C4增加到合并分支mywork上,并增加C5、C6的修改生成C5‘和C6‘版本
忽略文件.gitignore
Git不会进行提交的文件配置
文件 .gitignore 的格式规范如下:
• 所有空行或者以 # 开头的行都会被 Git 忽略。
• 可以使用标准的 glob 模式匹配。
• 匹配模式可以以(/)开头防止递归。
• 匹配模式可以以(/)结尾指定目录。
• 要忽略指定模式以外的文件或目录,可以在模式前加上惊叹号(!)取反。
所谓的 glob 模式是指 shell 所使用的简化了的正则表达式。 星号(*)匹配零个或多个任意字符;[abc] 匹配任何一个列在方括号中的字符(这个例子要么匹配一个 a,要么匹配一个 b,要么匹配一个 c);问号(?
)只匹配一个任意字符;如果在方括号中使用短划线分隔两个字符,表示所有在这两个字符范围内的都可以匹配
(比如 [0-9] 表示匹配所有 0 到 9 的数字)。 使用两个星号(*) 表示匹配任意中间目录,比如a/**/z
可以匹
配 a/z, a/b/z 或 a/b/c/z
等。
GitHub 有一个十分详细的针对数十种项目及语言的 .gitignore 文件列表,你可以在
https://github.com/github/gitignore 找到它.
使用规范
git提交名称
SSH使用姓名全拼,HTTPS为名称
git 提交信息书写规范
说明:fix <工作项Id>: <修改说明>
列子:fix #123 :修改readMe文件
分支命名
分支 | 命名 | 说明 |
---|---|---|
主分支 | master | 主分支,所有提供给用户使用的正式版本,都在这个主分支上发布 |
开发分支 | dev | 开发分支,永远是功能最新最全的分支 |
功能分支 | feature-* | 新功能分支,某个功能点正在开发阶段 |
发布版本 | release-* | 发布定期要上线的功能 |
修复分支 | bug-* | 修复线上代码的 bug |