一、版本控制工具
1、集中版本控制工具-svn/cvs
版本库存放在中央服务器,工作时从中央服务器下载/更新代码,修改后再提交到中央服务器
2、分布式版本控制工具-git
git 不需要中央服务器,每个人的电脑上都有一个完整的版本库,类似 github 这样的“中央服务器”存在是为了方便交换大家的修改,没有的话也可以,就是不方便交换修改
二、git
1、工作流程
2、基本配置
1、设置用户信息
git config --global user.name “xxx”
git config --global user.email “xxx@xxx.xxx”
2、查看配置信息
git config --global user.name
git config --global user.email
3、创建本地仓库
1)创建工作目录
2)进入工作目录
3)git init:创建成功后会生成 .git 隐藏目录
4、基础操作命令
工作目录(抛开 .git)下对于文件的修改(增加、删除、更新)会存在几种状态,这些修改状态会随着我们执行 git 命令而发生变化
- git add .|filename:工作区 -> 暂存区
- git commit -m “注释”:暂存区 -> 本地仓库
- git status:查看修改状态(暂存区、工作区)
- git log:查看提交日志,git log --pretty=oneline --abbrev-commit --all --graph
- all:显示所有分支
- pretty=oneline:将提交信息显示为一行
- abbrev-commit:使得输出的 commitID 更简短
- graph:以图的形式显示
- git reset --hard commitID:版本回退
- git reflog:可以查看 git log 没有的提交记录
- 添加文件至忽略列表(.gitignore)
一般我们总会有些文件无需纳入 git 管理,也不希望它们总出现在未跟踪的文件列表
cat .gitignore
# no .a files
*.a
# but do track lib.a, even though you're ignoring .a files above
!lib.a
# only ignore the TODO file in the current directory, not subdir /TODO
/TODO
# ignore all files in the build/ directory
build/
# ignore doc/notes.txt, but not doc/server/arch.txt
doc/*.txt
# ignore all .pdf files in the doc/ directory
doc/**/*.pdf
5、分支
你可以使用分支把你的工作从开发主线上分离开,然后再修改 bug、开发新功能,以免影响开发主线
- git branch:查看本地分支
- git branch +分支名:创建本地分支
- git checkout +分支名:切换分支
- git checkout -b +分支名:创建并切换分支
- git merge +分支名:合并分支,指定分支上的提交可以合并到当前分支上
- git branch -d +分支名:删除指定分支,不能删除当前分支,删除时需要做各种检查
- git branch -D +分支名:删除指定分支,不能删除当前分支,删除时不做任何检查,强制删除
解决冲突
两个分支上对文件的修改可能会存在冲突,例如同时修改了同一个文件的同一行,这时就需要手动解决冲突,步骤如下:
- 处理文件中冲突的地方
- 将解决完冲突的文件加入暂存区
- 提交到本地仓库
开发中分支使用原则与流程
- master(生产分支)
线上分支,主分支,中小规模项目线上运行应用对应的分支 - develop(开发分支)
从 master 创建的分支,一般是开发部门的主要开发分支,如果没有同期并行开发但不同期上线要求,都可以在此分支上进行开发,阶段开发完成后,再合并到 master 准备上线 - feature/xxx 分支
从 develop 创建的分支,一般是同期并行开发,但不同期上线时创建的分支,开发任务完成后,合并到 develop - hotfix/xxx 分支
从 master 创建的分支,一般是修复线上 bug,修复完成后合并到 master、test(用于代码测试)、develop - 还有一些其他分支,例如 pre(预上线分支)等
三、远程仓库
1、常用托管服务
- github
- 码云
- gitlab:需要自行搭建 git 私服
2、创建远程仓库
3、添加远程仓库
- git remote add <远端名称> <仓库路径>
git remote add origin ssh_info:添加远程仓库 - git remote:查看远程仓库
4、推送到远程仓库
- git push [-f] [ --set-upstream] [远端名称 [本地分支名][:远端分支名]]
- 如果远端分支名和本地分支名相同,则可以只写本地分支名
git push origin master:因为此时远端还没有任何分支,也就无需写远端分支名 - f:强制覆盖
- set-upstream:推送到远端的同时,建立起和远端分支的关联关系
git push --set-upstream origin master:因为此时远端还没有任何分支,也就无需写远端分支名
git branch -vv:查看关联关系
当前分支和远端分支关联后,直接 git push 即可
- 如果远端分支名和本地分支名相同,则可以只写本地分支名
5、从远程仓库克隆
- git clone <仓库路径> [本地目录]
6、从远程仓库抓取和拉取
- git fetch/pull [远端名称] [远端分支名]
- fetch:将远程仓库的修改抓到本地,但不进行合并
如果不指定远端名称和远端分支名,就抓取所有分支 - pull:将远程仓库的修改拉到本地并自动进行合并,等同于 fetch+merge
如果不指定远端名称和远端分支名,就抓取所有并更新当前分支
- fetch:将远程仓库的修改抓到本地,但不进行合并
7、git pull 冲突
A 用户在本地修改代码后优先推送到远程仓库,此时 B 用户在本地修改好代码并提交到本地仓库后,也需要推送到远程仓库,由于 B 用户晚于 A 用户推送,所以需要先拉取远程仓库的提交,经过本地合并后才能推送到远端分支,在 B 用户拉取代码时,有可能因为 A、B 用户修改了同一文件的相同位置代码,最终导致 git pull 冲突(实际上是 git merge 冲突)
完整的推送流程见下:
- 代码写好后,先 git pull
- 处理文件中冲突的地方
- 将解决完冲突的文件加入暂存区
- 提交到本地仓库
- git push