标签:Git、SVN、Github、码云gitee
1.版本控制简介
- 为什么需要版本控制?
大家肯定遇到过频繁多次修改论文等word文件的情况,极端情况是大家每次修改就另存为一个新文件,非常繁琐,效率很低,同时也无法准确描述每个副本的更改情况,因此我们需要一个工具记录我们的修改历史,保留每次修改后的最终文件,这就引入了版本控制。
- 版本控制分类?
版本控制分为上面所说的本地版本控制,集中版本控制和分布式版本控制。
集中式版本控制:
- 核心思想:中心服务器负责记录修改历史和保存
- 交互过程:参与协作的用户需要时刻连接远程的服务器直接操作服务器的文件,然后服务器记录各自的操作历史,最后生成版本。
- 问题:中心节点负载大、中心节点数据存在丢失风险、用户侧体验慢
- 变更历史:CVN→SVN[开源]、BitKeeper、微软VCS
分布式版本控制:
- 核心思想:每个用户自带副本,本地操作写到本地仓库,待合适时push到远程仓库,完成版本迭代
- 交互过程:各主机可以独立开发,然后把变更同步到本地仓库,最后随意同步到远程服务器
- 特点:权限控制【权限分配、审核】、分支管理【合并】、版本管理【快照】
- 优点:不用联网、数据安全有保障、数据完整性、与linux兼容
- 代表作品:Git
2.Git结构
总的来说,Git分为用户操作系统上的本地库和远程库,远程库即位于远程服务器的仓库,而本地库为用户本地某个文件夹,其通信流程如下图所示:
3. 本地库管理
1. 结构:包括工作区[workspace]、暂存区[index]、本地仓库[repository]
其中,工作区即当前项目所在本地的某个文件夹,暂存区可以理解为存放的修改历史,而本地仓库则是修改后的版本全部数据。
其中通过add命令把本地文件添加到暂存区,再通过commit提交到本地仓库。
2.本地库初始化操作→告诉git工具,某个文件夹需要他来管理
→进入文件夹→git init→此时该文件夹会出现.git的文件
3.本地库初始化操作2→告诉git工具自己的信息,即我是谁→git签名
→形式:用户名,email地址【可以随便写】
→命令级别:
- 项目级别
git config user.name jj git config user.email jj@163.com
- 系统级别
git config --global user.name zhangsan git config --global user.email zhangsan@183.com
【注意】此时你会发现用户文件夹/当前文件夹下会有.gitconfig的配置文件。
【查看配置文件】
git config --system --list git config --global --list
4.本地库add和commit操作
通用操作:
git status→git add XX→ git status→ git commit -m "描述信息" XX →git status 或者: git status→git add ..→ git status→ git commit -m "描述信息" →git status
5. 版本控制
前面讲到,每一个本地库的版本都有一个版本号,其实它是将我们的本地库版本数据经过自带的SHA-1哈希算法映射为固定长度的唯一标识信息,据此可以区分不同的版本和数据,在Git底层采用了HEAD指针指向当前的版本号,即本地仓库数据快照。
因此,根据这个版本号,我们就可以实现版本回退与前进、文件删除恢复、文件差异对比:
- 查看版本号:
- git log
- git log --pretty=oneline
- git log --oneline//选取前7位hash值;
- git reflog//显示指针编号
版本回退方式
方式1:hard:在本地库移动HEAD指针,重置暂存区,重置工作区
方式2:soft:只在本地库移动HEAD指针
方式3:mixed:在本地库移动HEAD指针,重置暂存区
理解:我们说这上面的本地库,暂存区,重置工作区可以理解为三兄弟,正常情况下是一排一起走,齐头并进,如果只移动部分,那么会导致数据出错。
回退指令:
法1:靠索引 git reset --hard hash值; 如:git reset --hard f52c18c 法2:靠指针 git reset --hard HEAD^ git reset --hard HEAD~3
- 文件差异对比
git diff 1.txt //此时是工作区与暂存区比较 git diff HEAD 1.txt 工作区与本地库某个版本比较 git diff 缺省比较多个文件
4.远程库连接、开发流程
一般情况下,有如下步骤:
第一步:在本地新建文件夹,例如folder,然后git bash here
第二步:输入git init初始化文件夹
第三步:输入git clone clone地址,如
git clone https://github.com/Zhujie-ww/jquery_search.git
【注意】这会有三个效果:拷贝文件、初始化本地库、创建origin远程地址别名。
第四步:开发、撸代码
第五步:git add . →git commit -m "更新日志"→git status→准备推送
第五步:push准备
前提:先使用git remote -v查看当前远程库是否存在别名及传送方式,如果有必要的话,可以git remote add origin XX.git地址→将连接命名为origin
【注意】这里的git地址可以使SSH格式,也可以是HTTP格式。如果是HTTP格式,则一般会要求登录,输入你的git地址所在的网站的注册的用户信息和密码;如果是SSH格式,则需要手动配置:
ssh-keygen -t rsa -C "1282206372@qq.com" 复制公钥密码到github/Gitee即可。
此时配置好后,系统用户文件夹下会有.SSH文件,里面有_PUB文件,直接打开复制粘贴到对应网站后台即可。
【注意2】SSH方式是全局的,不用每次登录,而http方式是每次需要登录,好处是可以选择不同的代码托管网站进行push。
第六步:开始push
git push origin master //这里的origin前面已经取别名绑定到了XX.git地址。
5.分支处理
git支持多分支,具体而言,拿github举例,分为master分支和其他分支,在实际开发中,这样的设计有利于并行开发,大大提高效率,同时开发独立,不会影响大分支。
![分支处理](https://i-blog.csdnimg.cn/blog_migrate/72c4105cfb9b40d5ef6230ab7a8c0c57.png)
分支的各命令如下:
第一个:查看分支:git branch -v
第二个:创建分支:git branch hot_fix
第三个:切换分支:git checkout hot_fix
第四个:合并分支
- 第一步:切换到被合并的分支上→即大分支上
git checkout master
- 第二步:进行merge合并/吞并
git merge hot_fix
最终效果:master分支吞并了hot_fix分支即上图的样子,成为master的新版本。
分支合并冲突:
描述:在不同分支对同一个文件进行相同操作时会合并失败,git不知道如何处理该文件
举例:
解决办法:与另一个分支作者进行交流,删除标记,修改到合适的位置,写入退出。
vim xx.txt//修改文件的标记,进行合并
git status
git add xx.txt
git commit -m "合并成功"//注意,这里千万不能带文件名,这是规定
6.团队内部开发流程
如图所示,岳不群与令狐冲要协作开发,都是一个队伍里的,怎么操作呢?
第一步:岳不群新建项目,如Aoteman小程序:
git init
git add .
git commit -m "第一版奥特曼程序"
git status
git reote -v
git remote add origin_http https://github.com/Zhujie-ww/jquery_search.git
git push origin master
此时登录密码后上传到了github服务器的jquery_search仓库,即远程库。
第二步:令狐冲通过clone、修改代码后进行push操作
git clone https://github.com/Zhujie-ww/jquery_search.git
git add .
git commit -m "这是令狐冲的第一版"
git status
git remote -v
git push origin master
此时显然会被git进行拦截,因为此时令狐冲并未获取代码push权限,此时需要找仓库主人-岳不群邀请加入。
第三步:岳不群拉令狐冲入伙
岳不群后台设置github仓库的权限,将邀请连接发给令狐冲,然后后者加入即可push。
第四步:岳不群查看
此时,由于岳不群的本地库与现在远程库的版本不一致,因此:
岳不群需要通过pull拉去所有的最新版本库,待查看,修改后提交,此时git才认为你是真的想提交了。【这是不是有点像多线程呢?】
值得注意的是,pull其实是fetch+merge,即获取数据,合并数据。
其中:fetch命令:
git fetch origin master
用于下载远程库的master分支到本机的origin/master文件夹下【自动新建,互不干扰】。
然后merge命令:
git merge origin/master[远程地址别名/分支名]
其含义是左侧所在的分支【一般是本地master】吃掉右边的远程地址的master分支,用于合并。
当然,以上两步可以合并为:
git pull origin master
【选择问题】如果变化小,建议pull,否则还是要fetch+merge。
【插曲】有时候,团队中成员会同时修改同一个文件的某一行内容,此时后push的用户必须要pull下来,然后将冲突的地方手动修改,最后push回去。
7.跨团队开发流程
如上图,不难发现,如果想临时加入第三方贡献人员的代码,可以这么做:
第一步:东方不败先fork到自己的github仓库,然后clone到本地,修改后push到自己的远程库
fork
git clone https://github.com/Zhujie-ww/jquery_search.git
git add .
git commit -m "这是东方不败的新贡献第一版"
git remote -v
git remote add origin_dongfnagbubai https://github.com/dfbb/Aotman.git
git push origin_dongfnagbubai master
第二步:东方不败在github提交自己的pull request给岳不群
第三步:岳不群审核后通过pull request,至此东方不败贡献的代码已然合并到岳不群的仓库中!
第四步:岳不群pull到本地进行修改
8.码云+git
第一步:注册完善信息
第二步:设置绑定SSH公钥,免密码登录
进入C:\USERS\ADMINISTRATOR\.SSH
生成公钥
ssh-keygen -t rsa
//采用rsa加密算法
此时生成两个文件,赋值_pub文件内容
第三步:在码云添加公钥,加入绑定,修改标题;
第四步:在码云新建仓库
设置是否公开
许可证:开源是否可以随便用,是否可以商用,是否可以转载。
最后,clone到本地,每次push默认到码云!
9.总结
第一点:分支管理其本质是HEAD指针标识,再次彰显指针妙法!
第二点:处处有缓存,git 第二次push时不用输入密码了,因为windows自带凭据管理器,记录下自己输入的密码,更为方便。
第三点:任何事情都要留后手,换在计算机世界中,时时要备份,处处有快照,不管是虚拟机的快照功能,还是SVN修改记录,或是Git副本存档,都保证了数据的安全性,尽管有时这是以空间为代价的。
第四点:下载慢的较好的解决思路之一是采用国内镜像网站!
第五点:常用linux命令要多用:
cd ./X #或者直接 cd X pwd clear/reset #清屏/重载 ls # 白色=文件、绿色=可执行文件,蓝色=目录 touch #文件名.后缀=新建文件) mkdir #新建文件夹 rmdir #删除文件夹 rm -rf / #递归清除linux的所有东西 history #查看历史命令 # 注释 exit #退出 help #帮助
第六点:版本同步时不想同步一些信息,方法:
在根目录下新建.gitignore文件,加入规则:
# 默认忽略的文件 /shelf/ /workspace.xml # Datasource local storage ignored files /dataSources/ /dataSources.local.xml # 基于编辑器的 HTTP 客户端请求 /httpRequests/ # IDEA配置文件 .idea/ *.iml *.ipr *.iws # 类文件 *.class *.log *.lock