2、git分布式版本控制工具
那分布式版本控制系统与集中式版本控制系统有何不同呢?
- 分布式版本控制系统根本没有“中央服务器”,每个人的计算机上都是一个完整的版本库,这样,你作业的时候,就不需要联网了,因为版本库就在你自己的计算机上,既然每个人计算机上都有一个完整的版本库,那多个人如何协作呢?比方说你在自己计算机上改了档案A,你的同事也在他的计算机上改了档案A,这时,你们俩之间只需把各自的修改推送给对方,就可以互相看到对方的修改了,
- 和集中式版本控制系统相比,分布式版本控制系统的安全性要高很多,因为每个人计算机里都有完整的版本库,某一个人的计算机坏掉了不要紧,随便从其他人那里复制一个就可以了,而集中式版本控制系统的中央服务器要是出了问题,所有人都没法干活了,
- 在实际使用分布式版本控制系统的时候,其实很少在两人之间的计算机上推送版本库的修改,因为可能你们俩不在一个局域网内,两台计算机互相访问不了,也可能今天你的同事病了,他的计算机压根没有开机,因此,分布式版本控制系统通常也有一台充当“中央服务器”的计算机,但这个服务器的作用仅仅是用来方便“交换”大家的修改,没有它大家也一样干活,只是交换修改不方便而已,
Git是分布式版本控制系统(Distributed Version Control System,简称 DVCS) ,分为两种型别的仓库:
本地仓库和远程仓库
本地仓库:是在开发人员自己计算机上的Git仓库
远程仓库:是在远程服务器上的Git仓库
Clone:克隆,就是将远程仓库复制到本地
Push:推送,就是将本地仓库代码上传到远程仓库
Pull:拉取,就是将远程仓库代码下载到本地仓库
3、Git历史
- 很多人都知道,Linus在1991年创建了开源的Linux,从此,Linux系统不断发展,已经成为最大的服务器系统软件了,
- Linus虽然创建了Linux,但Linux的壮大是靠全世界热心的志愿者参与的,这幺多人在世界各地为Linux撰写代码,那Linux的代码是如何管理的呢?
- 事实是,在2002年以前,世界各地的志愿者把源代码档案通过diff的方式发给Linus,然后由Linus本人通过手工方式合并代码!
- 你也许会想,为什么Linus不把Linux代码放到版本控制系统里呢?不是有CVS、SVN这些免费的版本控制系统吗?因为Linus坚定地反对CVS和SVN,这些集中式的版本控制系统不但速度慢,而且必须联网才能使用,有一些商用的版本控制系统,虽然比CVS、SVN好用,但那是付费的,和Linux的开源精神不符,
- 不过,到了2002年,Linux系统已经发展了十年了,代码库之大让Linus很难继续通过手工方式管理了,社区的弟兄们也对这种方式表达了强烈不满,于是Linus选择了一个商业的版本控制系统BitKeeper,BitKeeper的东家BitMover公司出于人道主义精神,授权Linux社区免费使用这个版本控制系统,
- 安定团结的大好局面在2005年就被打破了,原因是Linux社区牛人聚集,不免沾染了一些梁山好汉的江湖习气,开发Samba的Andrew试图破解BitKeeper的协议(这幺干的其实也不只他一个),被BitMover公司发现了(监控作业做得不错!),于是BitMover公司怒了,要识训Linux社区的免费使用权,
- Linus可以向BitMover公司道个歉,保证以后严格管教弟兄们,嗯,这是不可能的,实际情况是这样的:
- Linus花了两周时间自己用C写了一个分布式版本控制系统,这就是Git!一个月之内,Linux系统的原始码已经由Git管理了!牛是怎么定义的呢?大家可以体会一下,
- Git迅速成为最流行的分布式版本控制系统,尤其是2008年,GitHub网站上线了,它为开源项目免费提供Git存盘,无数开源项目开始迁移至GitHub,包括jQuery,PHP,Ruby等等,
历史就是这幺偶然,如果不是当年BitMover公司威胁Linux社区,可能现在我们就没有免费而超级好用的Git了,
提示:
- 红色(作业区有修改 并未添加到暂存区)
- 绿色(作业区的修改 已经添加到暂存区 并未提交到版本库)
3.nothing to commit, working tree clean
(作业区与版本库一致)
注意:git磁区(作业区、暂存区、本地版本库、远程仓库)
e、将档案添加到暂存区
git add Hello.java 将指定档案添加到暂存区
git add . 将目录所有档案添加到暂存区
# 将指定档案添加到暂存区
$ git add HelloWord.java
86151@TJCU MINGW64 /f/gitHelloWord (main)
$ git status
f、查看状态
执行命令 git status【变为绿色】
g、将档案提交到本地版本库
语法:git commit -m “当前版本描述信息”
例如:
$ git commit -m "新建了一个HelloWord类,包含主函式"
h、修改档案后,档案变成红色的了
i、先添加在commit
h、去除每次add时的警告信息
git config --global core.autocrlf false
2、版本查看及回退
a、查看版本状态
git log
(多行展示一个版本)
git log --pretty=oneline
(一行展示一个版本)
b、版本回退
- 回退n个版本
git reset --hard HEAD^
回退上一个版本
git reset --hard HEAD^^
回退上N个版本 几个^^表示回退几个版本
- 回退指定版本
git reset --hard commit_id
git reset --hard d6d7s7
- 回退未来版本
使用命令 查看所有历史命令git reflog
c、暂存区和作业区操作撤销
- sataged翻译:阶段 restore:恢复
- 撤销暂存区操作:
git restore --staged HelloWord.java
- 撤销作业区操作:
git restore HelloWord.java
- 注意:提交到版本库后不支持撤销,可以使用版本回退
3、Git磁区原理
版本库(Repository)
作业区有一个隐藏目录.git
,这个不算作业区,而是Git的版本库,
Git的版本库里存了很多东西,其中最重要的就是称为stage(或者叫index)的暂存区,还有Git为我们自动创建的第一个分支
master
,以及指向master
的一个指标叫HEAD
,
- 我们把档案往Git版本库里添加的时候,是分两步执行的:
第一步是用git add
把档案添加进去,实际上就是把档案修改添加到暂存区;
第二步是用git commit
提交更改,实际上就是把暂存区的所有内容提交到当前分支,
因为我们创建Git版本库时,Git自动为我们创建了唯一一个master
分支,所以,现在,git commit
就是往master
分支上提交更改,
你可以简单理解为,需要提交的档案修改通通放到暂存区,然后,一次性提交暂存区的所有修改,
4、洗掉档案
a、洗掉没用档案(将作业区档案洗掉)
- 直接洗掉
- 使用命令洗掉 rm -f 档案
- 可以回退洗掉
b、确认洗掉 (将作业区洗掉的操作提交到暂存区)
git add/rm 档案
c、确认提交到版本库
git commit -m “提示信息”
5、分支管理
分支就是科幻电影里面的平行宇宙,当你正在计算机前努力学习Git的时候,另一个你正在另一个平行宇宙里努力学习SVN,
如果两个平行宇宙互不干扰,那对现在的你也没啥影响,不过,在某个时间点,两个平行宇宙合并了,结果,你既学会了Git又学会了SVN!
a、作用:
- 用于管理个人代码,在所有人确认无误后汇总合并分支,平时在操作时分支之间互不干扰
- master(主分支)
b、创建分支
git branch dev
c、查看分支
git branch
d、切换分支
git checkout dev
e、创建并切换分支
git checkout -b dev
f、合并分支
git checkout master
切换到最终合并的分支上
git merge dev
将merge后指定分支的修改合并到当前分支上
g、洗掉分支
git branch -d dev
【注意:不能自己删自己】
五、远程版本库配置使用
1、远程版本库(远程代码托管平台)选取码云(Gitee)
[ https://www.zhihu.com/question/387515137 了解代码托管平台 ]
- 全球最流行的代码托管平台:GitHub
GitHub是全球最流行的面向开源及私有软件项目的托管平台,有超过2600万的用户群体,随着越来越多的应用程序转移到了云上,GitHub已经成为了管理软件开发以及发现已有代码的首选方法,GitHub可以托管各种git库,并提供一个web界面,与其它代码托管平台不同的是GitHub的“分支”结构可以很容易地将某个项目的成功经验应用到另外与一个项目中,此外,GitHub还提供了针对企业私有云服务的GitHub企业版,
- 开源中国旗下的代码托管平台:码云
码云是开源中国社区团队推出的基于Git的快速的、免费的、稳定的在线代码托管平台,专为开发者提供的云端软件开发协作平台,无论是个人、团队、或是企业,都能够用码云实作代码托管、项目管理、协作开发,
- 基于git的仓库管理程序:GitLab
GitLab是一个利用 Ruby on Rails 开发的开源应用程序,实作一个自托管的Git项目仓库,可通过Web界面进行访问公开的或者私人项目安装, 拥有与GitHub类似的功能,能够浏览源代码,管理缺陷和注释,可以管理团队对仓库的访问,它非常易于浏览提交过的版本并提供一个档案历史库, 团队成员可以利用内置的简单聊天程序(Wall)进行交流,它还提供一个代码片段收集功能可以轻松实作代码复用,便于日后有需要的时候进行查找,
2、注册gitee账号
自己在官网创建一个,要想使用码云的相关服务,需要注册账号(地址: https://gitee.com/signup )
3、新建仓库
首页–>仓库–> + [右上角] --> 新建仓库
填充仓库名称 和 简介 --> 选择开源
初始化仓库[测验随便选] java | jetBrains | OBSD
设定模板[测验随便选] 全部勾选
选择创建
- [许可证说明 http://www.ruanyifeng.com/blog/2017/10/open-source-license-tutorial.html]
开源许可证是一种法律许可,通过它,著作权拥有人明确允许,用户可以免费地使用、修改、共享著作权软件,
著作权法默认禁止共享,也就是说,没有许可证的软件,就等同于保留著作权,虽然开源了,用户只能看看原始码,不能用,一用就会侵犯著作权,所以软件开源的话,必须明确地授予用户开源许可证,
- 每个Git远程仓库都会对应一个网络地址,可以点击克隆/下载按钮弹出视窗并点击复制按钮获得这个网络地址
4、邀请其他用户成为仓库成员
前面已经在码云上创建了自己的远程仓库,目前仓库成员只有自己一个人(身份为管理员),在企业实际开发中,一个项目往往是由多个人共同开发完成的,为了使多个参与者都有权限操作远程仓库,就需要邀请其他项目参与者成为当前仓库的成员,
我们当前创建的Git远程仓库对应的地址为:https://gitee.com/wanghengjie563135/EMS.git
6、将远程版本库拉取到本地(在本地库和远程仓库建立联系)
a、仓库右上角克隆/下载位置复制仓库路径 HTTPS 或 SSH
- Git远程仓库对应的SSH地址为:
git@gitee.com:wanghengjie563135/git-test.git
b、本地新建目录
c、在目录中开启bash视窗执行克隆命令
语法:git clone 仓库路径
例如:git clone ``[git@gitee.com](mailto:git@gitee.com)``:wanghengjie563135/EMS.git
d、执行后提示是否确认 输入yes
e、拉取失败【没有权限】
提示:Please make sure you have the correct access rights and the repository exists.
[请确保您拥有正确的访问权限并且存盘库存在]
f、设定gitee访问权限——生成ssh key
a、检查是否存在.ssh目录
位置:当前计算机用户主目录下 C:\Users\Administrator.ssh
b、检查.ssh目录中是否存在 id_rsa.pub 和 id_rsa 档案 【计算机远程访问公/私钥档案】
存在跳过,不存在生成对应档案
c、生成id_rsa.pub 和 id_rsa档案命令
ssh-keygen -t rsa
后续一直enter确认
- 查看自己的公钥:
cat ~/.ssh/id_rsa.pub
g、设定gitee访问权限——配置公钥
a、点击gitee右上角个人设定–>选择设定–>左侧导航栏选择 SSH公钥
b、标题随意 --> 公钥 [打开刚才生成的C:\Users\Administrator/.ssh/id_rsa.pub档案复制粘贴]–>输入登录密码
h、再次执行命令拉取远程版本库
git clone ``[git@gitee.com](mailto:git@gitee.com)``:wanghengjie563135/EMS.git
7、使用远程版本库
a、进入到对应库中
b、新建HelloWord档案
c、推送至远程版本库
git push -u origin master
[ -u:分支关联 origin:远程库的名字 master:本地分支名字]
d、将远程修改同步到本地
git pull origin master
8、将本地项目推送至远程版本库
a、在本地准备项目
b、在远程仓库中定义仓库(空仓库)
选择新建仓库–>填充仓库名称–>填充介绍–>选择开源–>选择创建
c、依次执行命令
git init
#初始化仓库git add .
#将项目的所有内容添加到暂存区git commit -m "first commit"
#提交到本地版本库git remote add origin ``[git@gitee.com](mailto:git@gitee.com)``:wanghengjie563135/vue.git
#当前仓库与远程仓库建立一个链接
git push -u origin master
#推送本地库项目至远程仓库
- 推送成功
d、相关报错总结
- 报错原因:们在创建仓库的时候,都会勾选“使用Reamdme档案初始化这个仓库”这个操作初识了一个README档案并配置添加了忽略档案,当点击创建仓库时
它会帮我们做一次初始提交,于是我们的仓库就有了README.m和.gitignore档案,然后我们把本地项目关联到这个仓库,并把项目推送到仓库时,我们在关联本地与远程时,两端都是有内容的,但是这两份内容并没有联系,当我们推送到远程或者从远程拉取内容时,都会有没有被跟踪的内容,于是你看git报的详细错误中总是会让你先拉取再推送,但是拉取总是失败,
- 将这些档案洗掉后再提交
- 相关报错参考方案:
https://blog.csdn.net/qq_33934427/article/details/109004052
六、Git与IDEA工具集成
1、在IDEA中集成Git
File | Settings | Version Control | Git | 点击右上角 Test 测验git环境是否正常 (展示版本号表示正常)
2、修改idea Terminal为 Git bash
File | Settings | Tools | Terminal |
修改 Shell path : git安装目录/bin/bash.exe
3、git init
初始化仓库
4、执行命令设定仓库
git init #初始化仓库
git add . #将项目的所有内容添加到暂存区
git commit -m “first commit” #提交到本地版本库
git remote add origin https://gitee.com/wanghengjie563135/studnet-system.git #当前仓库与远程仓库建立一个链接
git push -u origin master #推送本地库项目至远程仓库
- 上传成功
5、在项目中进行后续开发 注意档案状态(颜色)
- 红色:作业区已修改并未添加到暂存区
- 绿色:修改已经添加到暂存区暂未提交到版本库
- 黑色|白色:版本库与作业区一致
- 蓝色:该类已经提交到版本库,有修改 修改之后可以直接commit
6、完成开发后要添加到暂存区、提交本地库 并且 提交到远程版本库
- 添加暂存区 :右击要提交档案/档案夹–>Git–> + Add
- 交本地库 :右击要提交档案/档案夹–>Git–> Commit File -->输入提示信息–>Commit
- 提交远程库 :右击要提交档案/档案夹–>Git–> Push --> 选择Push
7、从远程版本库中拉取项目
右击项目–> Git --> Pull --> 选择Pull
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-j1DE9INn-1640864886517)(image/image_67.png)]
8、代码冲突问题
[开发前没有先Pull拉取代码,直接修改内容,之前远程代码已经进行修改]
- a、此时提交会弹框提示 提供三个解决方案:Cancel(退出) | Merge(合并) | Rebase(退回当前状态)
- b、选择Merge
1、代码无交集 直接pull成功
2、代码有交集 再次弹框 提供三个解决方案:Accept Yours(使用pull者) | Accept Theirs(使用远程) | Merge (手动)
3、选择手动合并 会弹出协同合并操作视图 整合代码
4、完成后选择Apply 提示:使用修改并记录方案 | 继续手工修改
9、查看历史版本 右击要回退档案/档案夹–>Git–>Show History
- 查看历史版本
10、回退版本
a、右击要回退档案/档案夹–>Git–>Show History -->选择要回退版本 右击–> Copy Revision Number
b、选择当前视窗同行的 Log视窗 --> 选择要回退版本 右击 --> Checkout ReVision ‘xxxxxx’
11、添加到暂存区后回退
选择commit视窗(project下)–>右击要回退的档案/目录–>Rollback
12、根据版本号回退
a、选择要回退的版本id 右击要回退档案/档案夹–>Git–>Show History -->选择要回退版本 右击–> Copy Revision Number
b、右击要回退档案/档案夹–>Git–>Reset HEAD
c、Reset Type 选择Hard | To Commit 复制版本id
13、查看分支
点击IDEA右下角黄色感叹号位置
14、新建分支
点击IDEA右下角黄色感叹号位置–>new Branch–> 填写分支名 -->确认
15、切换分支
点击IDEA右下角黄色感叹号位置–>选择要切换的分支–>点击右侧箭头–>选择Checkout
16、洗掉分支/修改分支名字
点击IDEA右下角黄色感叹号位置 -->选择要洗掉/改名的分支 -->Delete/Rename
17、合并分支
a、使用其他分支开发内容
b、合并前切换到主分支
c、选中要合并的分支–>点击右侧箭头–>Merge into Current
0 评论