集中式和分布式版本控制工具的区别
先说说集中式版本控制,它是有一台版本控制服务器作为仓库,当用户拉取的时候,下载的是最新的版本仓库,相当于只对最新的版本做了一个镜像拷贝。
再来说说分布式版本控制,它也是一个仓库,当用户拉取的时候,下载的是整个版本仓库的一个镜像拷贝,相当于你本地的仓库和服务器仓库都是完成的版本信息。
这样架构的话集中式和分布式会造成什么影响和差异呢
- 集中式版本控制当服务器本仓库删除或者发生意外,数据难以恢复,而分布式相当于,每一个用户都有一个完整的版本库,重新上传版本到线上即可
- 当集中式的仓库宕机后或者本地无法联网的时候,
git还是可以继续把需要提交的版本存放到本地仓库,等待联网或服务器恢复后推送本地仓库到远程仓库做同步,这是集中式版本控制很难完成的
Git 命名规范
- master(主分支,永远是可用的、稳定的、可直接发布的版本,不能直接在该分支上开发)
- develop(开发主分支,代码永远是最新,所有新功能以这个分支来创建自己的开发分支,该分支只做只合并操作,不能直接在该分支上开发)
- feature-xxx(功能开发分支,在develop上创建分支,以自己开发功能模块命名,功能测试正常后合并到develop分支)
- release(预分布分支,在合并好feature分支的develop分支上创建,主要是用来测试bug的分支,修改好bug并确定稳定之后合并到develop和master分支,然后发布master分支)
- release-fix(功能bug修复分支,在release上创建分支修复,修复好测试出来的bug之后合并回release分支。)
- hotfix-xxx(紧急bug修改分支,项目上线之后可以会遇到一些环境问题需要紧急修复,在master分支上创建,流程跟release分支相似,修复完成后合并到develop和master分支)
注意事项:
一个分支尽量开发一个功能模块,不要多个功能模块在一个分支上开发。
开发过程中,如果组员A开发的功能依赖组员B正在开发的功能,可以待组员B开发好相关功能之后,组员A直接pull组员B的分支下来开发,不需要先将组员B的分支 merge 到develop分支。
feature 分支在申请合并之前,最好是先 pull 一下 develop 主分支下来,看一下有没有冲突,如果有就先解决冲突后再申请合并。
SSH
ssh-keygen -o -t rsa -b 4096 -C "email@ccb.com"
cat ~/.ssh/id_rsa.pub
把 ssh 公钥复制到 git SSH Keys 上做一个互信
git help
查看git指定命令的帮助文档
git help [command]
git init
git 初始化
git init
git remote
添加远程仓库
git remote add origin https://gitee.com/Emlice/whistle-bos
git remote add [仓库名] [仓库地址]
git config
修复gitk图形界面中文乱码
git config --global gui.encoding utf-8
查看 git 用户设置
git config --list
存在多个相同的常量,取最下面的
修改用户名配置
系统用户配置
git config --system user.name "Emlice"
git config --system user.email "xiaomozyw@sina.com"
全局用户配置
git config --global user.name "Emlice"
git config --global user.email "xiaomozyw@sina.com"
项目用户配置
git config user.name "Emlice"
git config user.email "xiaomozyw@sina.com"
优先级:项目->全局->系统
设置记住密码 (默认15分钟)
git config --global credential.helper cache
设置记住密码的实效
git config credential.helper 'cache --timeout=3600'
长期存储密码
git config --global credential.helper store
git clone
拉取指定分支或tag点的项目于 [renameDir] 文件夹
git clone -b [branch/tags] [url] [renameDir]
git branch
新建本地分支
git branch XXX
删除本地分支
git branch -d XXX
重命名本地分支
git branch -m oldName newName
删除本地分支
git branch -d xxx
git checkout
丢弃工作区的所有修改
git checkout .
丢弃工作区某个文件的修改
git checkout -- [file]
切换分支
git checkout XXX
新建分支并切换
git checkout -b XXX
新建本地开发分支并关联远程分支
git checkout -b XXX origin/XXX
创建本地分支并把线上分支拉下来
git checkout -t XXX
git merge
把本地xxx分支合并到当前分支
git merge xxx
把远程xxx分支合并到当前分支
git merge origin/xxx
git fetch
拉取远程origin仓库到本地仓库,工作区并不会改变
git fetch origin
git push
新建远程分支并将本地分支推送到该分支
git push origin dev:dev
删除远程分支
git push origin :XXX
上传本地仓库并产生关联
git push origin dev -u
git stash
将工作区的修改储存起来
git stash
将工作区的修改释放出来
git stash pop
git tag
给历史版本打标签
git tag -a v1.0 [sha1:ID]
分享本地所有标签
git push origin --tags
参数解析:
-a 表示要建立带有附注的标签
-m 类似于普通提交让你输入附注信息, 如果省略则弹出 VIM
git archive
导出仓库某个时间点的代码,可设置导出格式(zip/tar/gz.tar)
git archive -v --format=zip v0.1 > v0.1.zip
--format 表示导出的格式
-v 表示对应的tag名
git 功能片段
- 新建远程分支
git checkout -b aaa
git push origin aaa(本地分支):bbb(远程分支) / git push origin aaa
- 新建一个本地跟踪分支(即可以直接通过git push 和 git pull 操作)
git checkout -b xxx origin/xxx / git checkout --track origin/xxx
- 发布一个版本标签
git tag -a v1.0 -m "xxxx"
git push origin v1.0
- 修剪远程仓库已删除,本地仍旧存在的远程分支(git branch --all)
# 显示所有远程分支情况
git remote show origin
# 修剪远程仓库已删除的分支
git remote prune origin
- git clone 指定分支代码并切换到该分支
git clone -b [分支名/tags] [远程仓库地址]
- git 清除未跟踪的文件
# 清除未跟踪的文件
git clean -f
# 清除未跟踪的文件夹
git clean -d
# 查看将要清除的文件文件夹
git clean -nfd
- 修改远程仓库地址
方法一
# 先清除本地远程仓库, 再重新添加
# 删除
git remote rm [远程仓库简称/默认的是 origin]
# 新增
git remote add [远程仓库简称] [详细地址]
方法二
直接修改 config 文件
进入本地仓库配置目录.git找到config文件,修改关键字
注意
注意不要用git remote set-url去改动,会造成pull和fetch地址不一致
- 给历史版本打
tag点
# 查看版本日志 | 单行查看
git log --oneline
# 获取版本comit
git tag v1.0 abcdef
# 查看版本记录是否在对应 commit 打上 tag 点
git log --oneline
- 重写 commit
git commit --amend
git 知识点
merge 和 rebase(衍合)
merge是a分支和b分支还有a和b分支的第一个祖先版本做一个三方合并。而rebase是把a分支的东西在b分支上重打一遍,相当于补丁。
合并和衍合最大的区别在于,衍合能得到干净的历史记录,看起来就像是从头到尾都在一条线上开发的一样,并且衍合是重演了一次修改动作,而合并只是把结果合在一起。
特别注意:一旦分支中的提交对象发布到公共仓库,就千万不要对该分支进行衍合操作。
# 衍合操作
git rebase [主分支] [特性分支]
友情提示:当你发现命令无效的甚至报错的时候,可能是你的
git版本太低了!!!
远程仓库宕掉或误删除, 如何恢复
先将本地仓库推送至新仓库
- 首先新建一个空的远程仓库
vi .git/config修改原远程仓库的地址更正为新地址git push origin --all把本地所有分支推送到远程仓库git push origin --tags把本地所有 tag 点推送到远程仓库
再尝试还原不是自己的开发的分支, 从 fetch 中还原(只是原仓库的历史版本, 不能保证最新)
git branch -r查看原远程仓库镜像, 看是否有可还原的的分支git checkout -b xxx origin/xxx把原远程仓库的分支基础上创建本地新分支git push origin xxx把这个分支推送到新的仓库去
注意
这次操作告诉我们,要把git pull和git fetch当做一种习惯去同步远程仓库和本地仓库的代码