概述
【1】Git技术:公司必备,一定要会
【2】Git概念:
Git是一个免费的、开源的分布式版木控制系统,可以快速高效地处理从小型到大型的项目。
【3】什么是版本控制?
版本控制是一种记录一个或若千文件内容变化,以便将来查阅特定版本修订情况的系统.
【4】为什么要使用版本控制?
软件开发中采用版本控制系统是个明智的选择。
有了它你就可以将某个文件回溯到之前的状态,甚至将整个项目都回退到过去某个时间点的状态。就算你乱来一气把整个项目中的文件改的改删的删,你也照样可以轻松恢复到原先的样子。
但额外增加的工作量却微乎其微。你可以比较文件的变化细节查出最后是谁修改了哪个地方从而找出导致怪另问题出现的原因,又是谁在何了某个功能缺陷等等。
【5】版本控制系统的分类:
集中化的版本控制系统:
集中化的版本控制系统诸如CVS,SVN 以及Perforce等,都有一个单一的集中管理的服务器,保存所有文件的修订版本,而协同工作的人们都通过客户端连到这台服务器.取出最新的文件或者提交更新。多年以来,这已成为版本控制系统的标准做法这种做法带来了许多好处现在.每个人都可以在一定程度上看到项目中的其他人正在做些什么。而管理员也可以轻松掌控每个开发者的权限,并且管理一个集中化的版本控制系统;要远比在各个客户端上维护本地数据库来得轻松容易.
事分两面,有好有坏。这么做最显而易见的缺点是中央服务器的单点故障。如果服务器宕机一小时,那么在这一小时内,谁都无法提交更龂无法协同工作。
分布式的版本.控制系统
由于上面集中化版本控制系统的那些缺点,于是分布式版本控制系统面世了。
在这类系统中,像Git, BitKeeper等,客户端并不只提取最新版本的文件快照,而是把代码仓库完整地镜像下来。|
更进一步,许多这类系统都可以指定和若干不同的远端代码仓库进行交互。这样,你就可以在同一个项目中分别和不同工作小组的人相互协作。
分布式的版本控制系统在管理项目时存放的不是项目版本与版本之间的差具.它存的是索引(所需磁盘空间很少所以每个客户端都可以放下整个项目的历史记录)
git的安装
【1】去git官网下载软件包:
Gi主页
点击如图位置,下载(默认是64位)
【2】点击安装包进行安装
一直点Next,直到下面页面选择 第一个
继续点Next.直接安装
打开git终端(git 命令行)
git 结构
git 本地结构
代码托管中心本地库和远程库的交互方式
【1】代码托管中心是干嘛的呢?
我们已经有了本地库,本地库可以帮我们进行版本控制,为什么还需要代码托管中心呢?它的任务是帮我们维护远程库
下面说一下本地库和远程库的交互方式,也分为两种:
(1)团队内部协作
(2)跨团队协作
【2】托管中心种类:
局域网环境下:可以搭建GitLab服务器作为代码托管中心,GitLab可以自己去搭建
外网环境下:可以由GitHub或者Gitee作为代码托管中心,GitHub或者Gitee是现成的托管中心,不用自己去搭建
初始化本地
【1】创建一个文件夹:
【2】打开Git终端:
Git Bash Here:
进入以后对字体和编码进行设置:
在Git中命令跟Linux是一样的:
1.git --version 查看当前git版本
2.clear 进行清屏
3.设置签名
设置用户名和邮箱
4.本地仓库的初始化操作
.git目录是隐藏的,可以调出来看:
查看.git下内容
注意事项:.git目录下的相关的子目录和子文件不要删除,不要胡乱修改。
git常见命令
git add 文件
git commit -m “一些注释信息” 文件
git add 文件
添加文件:add 提交文件:commit
创建一个文件,然后查看状态
然后将Demo1.txt通过git.add命令提交至:暂存区:
查看状态:
修改文件内容:
查看状态(又变成未提交)
重新添加到暂存区
然后将暂存区的文件提交到本地区
git log 命令
git log 可以让我们查看提交的,显示从最近到最远的日志
下一页:空格
上一页:b
到尾了,显示END
退出:q
日志展示方式:
【1】方式一:git log 分页
【2】方式二:git log --pretty=oneline 在一行进行显示
【3】方式三:git log --oneline
【4】方式四:git reflog
多了信息:HEAD@{数字}:表示指针回到这个历史版本需要走多少步
git reset
reset命令:前进或者后退历史版本
【1】hard参数
git reset --hard 索引(hash值)
本地库的指针移动的同时,重置暂存区,重置工作区的索引
【2】mixed参数:
本地库的指针移动的同时,重置暂存区,但是工作区不动
【3】soft 参数
本地库的指针移动的时候,暂存区,工作区都不动
总结:以后用的最多的就是第一种hard参数
删除命令
【1】新建一个Test1.txt文件
【2】将它add到暂存区
【3】再通过commit提交到本地库
【4】删除工作区中的Test1.txt
【5】将删除操作同步到暂存区
上面的 rm Test1.txt已经将Test1.txt从工作区中删除,只需要使用git add Text1.txt即可将删除操作同步到暂存区
【6】将删除操作同步到本地库
【7】查看日志:
找回本地库删除的文件
找回本地库中删除的文件,通过 git reset --hard hash值
找回缓存区中删除的文件
还是可以通过git reset --hard hash值
或者git reset --hard HEAD
【1】删除工作区数据:
【2】同步到缓存区
【3】后悔了,恢复缓存区中的数据
diff命令
【1】先创建一个文件,添加到缓存区,再提交到本地库
【3】更改工作区中Test3.txt中内容,增加内容:
导致:工作区和暂存区 不一致,比对:通过
总结: git diff 文件名 :将工作区的文件和暂存区的内容进行比较
多个文件的比对:
总结: git diff :比较工作区和暂存区 所以文件的差异
比较暂存区和工作区之间的的差异:
总结:可以通过 git diff hash值 文件名 进行比较暂存区和工作区之间的的差异
分支
【1】什么是分支
在版本控制过程中,使用多条线同时推进多个任务,这里面说的多条线,就是多个分支
【2】通过一张图展示分支:
【3】分支的好处:
同时多个分支可以并行开发,互相不耽误,互相不影响,提高开发效率。如果有一个分支功能开发失败,直接删除这个分支就可以了,不会对其它分支产生任何影响。
操作分支
【1】在工作区创建一个Test4.txt 文件,先提交到缓存区,后提交到本地库
【2】查看分支(git branch -v)(只有主干):
【3】创建新的分支(git branch 分支名):
再查看
【4】切换分支(git checkout 分支名)
在分支中添加内容:
【1】进入branch01分支,增加内容:
【2】将分支切换到master
然后在主分支加入内容:
【3】再切换到branch01分支查看:
【4】将branch01分支 合并到主干:
(1)进入主分支:
(2)将branch01中的内容与主分支内容进行合并:
查看文件(出现冲突(在同一文件的同一个位置修改))
解决:
公司内部商议解决,或者自己决定,认为解决,留下想要的即可:
将工作区内容添加到暂存区:
然后进行commit 操作:
GutHub的使用
注册GitHub账号
回顾本地库和远程库交互方式
本地库进行创建(D盘下)
远程库进行创建(gitHub)
远程地址比较长,每次复制比较麻烦
https://github.com/joyzhouyi/GitResp2.git
查看别名(还没有别名):
起别名
推送操作
克隆操作
克隆操作可以帮我们完成:
(1)初始化本地库
(2)将远程库内容完整的克隆到本地
(3)替我们创建远程库的别名
邀请加入团队,push操作
克隆别人的代码后
【1】更新了本地库的内容,然后添加到暂存区,又提交到本地库:
【2】push内容到远程库中去:
发现可以直接push进去,并没有输入密码,或者也没提示错误(在一台电脑上时)
原因:git使用的时候在本地有缓存
可以将缓存删除
再次重新push(要输入另一人的密码账号),发现出错
必须要加入团队:
登录项目经理的账号,邀请普通成员
登录被邀请者的账号,接受邀请(在地址栏录入邀请链接即可)
远程库的拉取修改操作
【1】拉取操作 pull 操作,相当于 fetch+merge
【2】项目经理进行拉取操作:
(1)先时抓取操作:fetch
在抓取操作后,只是将远程库的内容下载到本地,但是工作区的还是原先的内容:
抓取后可以去远程库中看看内容是否正确:
然后发现内容都正确,就可以进行合并操作了:
合并之前要进行切换到本地master库
(2)进行合并:merge
远程库的拉取可以直接利用pull命令来完成:
fecth+merge操作:为了保险
pull:代码简单,省事
协同开发合作时冲突的解决方法
【1】
向远程库推送数据:
【2】
做了一个拉取操作:
到这里为止,现在远程合作没有任何问题。
现在操作同一个文件的同一个位置的时候,就会引起冲突:
【3】
再次做了推送操作
改动位置
【4】
改动Test.txt中的内容,然后进行推送:
在冲突的情况下,先应该拉取下来,然后修改冲突,然后再推送到远程服务器
先拉取:
查看冲突:
人为解决冲突(该删的删该留的留)
解决这个问题之后,向服务器进行推送:
推送:
解决了冲突。
跨团队合作
【1】得到远程数据库的地址:
【2】进行fork操作:
进入到账号后:复制地址:https://github.com/zhaoshanshan3366/GitResp2.git
然后点击下面的fork操作:
【3】然后就可以克隆到本地,并且进行修改
然后更改数据:添加到暂存区,然后提交到本地库,然后Push到远程库
【4】进行pull request操作:
【5】进行审核操作:
ssh免密登录
【1】进入用户的主目录中:
【2】执行命令,生成一个.ssh的目录
解释:
keygen ----> key generation
注意:C要大写
(我这里进行了ssh的重新绑定ssh-keygen -t rsa -C"yourName@公司.com)
后面的邮箱,是你的github注册的账号
三次回车,确认默认值即可
发现在.ssh目录下有两个文件:
【3】打开id_rad.pub文件,将里面的内容进行复制操作:
【4】打开github账号
【5】生成密钥以后,就可以正常进行Push操作了:
(1)对远程ssh远程地址进行起别名(git remote add 别名 源地址):
(2)展示别名(git remote -v):
创建了一个新文件
idea 集成git
本地库的初始化操作:
本地库初始化完成了,生成了.git目录
因为他们是两个不同的项目,要把两个不同的项目合并,git需要添加一句代码,在git pull 之后,这句代码是在git 2.9.2版本发生的,最新的版本需要添加–allow-unrelated-histories告诉git允许不相关历史合并。
假如我们的源是origin,分支是master,那么我们需要这样写git pull origin master --allow-unrelated-histories
这个方法只解决因为两个仓库有不同的开始点,也就是两个仓库没有共同的commit 出现的无法提交。如果使用本文的方法还无法提交,需要看一下是不是发生了冲突,解决冲突再提交
push推送: git push -u origin master -f
到这里 远程库和本地库就可以进行交互了
进行push操作,一般先进行pull操作
用idea从远程克隆项目
解决冲突
【1】团队开发时避免在一个文件中改代码
【2】在修改一个文件时,在进行push之前,先pull操作