1.Git
- 1.
Git
是一个免费开源的分布式版本控制系统- 2.
Git
易于学习,占地面积小,性能极快,具有廉价的本地库,方便的暂存区域和多个工作流分支等特性- 3.
Git
性能优于Subversion(SVN)
,CVS
等版本控制工具
1.版本控制
- 1.版本控制是一种记录工作内容变化,以便将来查阅特定版本修订情况的系统
- 2.版本控制最重要的是可记录文件修改历史记录,从而让用户能够查看历史版本,方便版本切换
1.1.版本控制的原因
- 1.方便个人开发过渡到团队协作
1.2.版本控制工具
1.2.1.集中式版本控制工具
- 1.集中式版本控制工具有
Subversion
(SVN
),CVS
等- 2.集中式的版本控制工具都有一个单一的集中管理服务器,用于保存所有文件的修订版本,协同工作的用户都通过客户端连到该台服务器,取出最新的文件或提交更新
- 3.
优点
:可以一定程度上查看项目中成员的进度,管理员可以掌握每个成员的权限,并且管理一个集中化的版本控制系统,比在各个客户端上维护本地数据库方便- 4.
缺点
:中央服务器会出现单点故障,如果服务器宕机,则宕机期间无法协同工作从而影响进度
1.2.2.分布式版本控制工具
- 1.分布式版本控制工具有
Git
,Mercurial
等- 2.
Git
分布式版本控制工具中客户端提取的不是最新版本的文件快照
,而是把远程代码仓库
完整地镜像下来保存在本地库
- 3.任何一处协同工作用的文件发生单点故障,都可以通过其他客户端的本地仓库进行恢复,因为每个客户端的每一次提取操作,实际上都是一次对整个文件仓库的完整备份
- 4.分布式的版本控制系统出现了之后,解决了集中式版本控制系统的缺陷(单点故障造成系统瘫痪)
- 1.服务器断网的情况下也可以进行开发(因为版本控制是在本地进行的)
- 2.每个客户端保存的也都是整个完整的项目(包含历史记录,更加安全)
2.工作机制
2.1.区域划分
- 1.
Git
版本控制工具可以划分为三个区域
- 1.
工作区(workspace)
:项目代码存放本地磁盘的位置- 2.
暂存区(Index / Stage)
:临时存放改动的代码,本质是一个文件(.git
目录下的index
文件),保存即将提交到本地库的信息- 3.
本地库(local Repository)
:将暂存区中的代码提交到本地库,生成对应的历史版本(无法删除),下个版本基于上一个版本,所以无法删除中间的版本,其中HEAD
指向最新放入仓库的版本- 2.远程库(
Remote Repository
):远程仓库,托管代码的服务器,将本地库代码推送到远程库(Push
)
2.2.工作流程
- 1.区域说明
- 1.左侧为
工作区
- 2.右侧为
版本库
- 3.版本库中标记为
index
的区域是暂存区(stage/index
)- 4.版本库中标记为
master
的是master
分支所代表的目录树- 5.版本库中标记为
HEAD
的是指向master
分支的一个游标
- 6.版本库中标记为
objects
的是Git
的对象库,位于.git/objects
目录下,其中包含创建的各种对象及内容- 2.工作流程
- 1.当对
工作区
中修改或新增的文件执行git add
命令时,暂存区
的目录树被更新同时工作区
修改或新增的文件内容被写入到对象库
中的一个新的对象中,而该对象的ID
被记录在暂存区的文件索引
中- 2.当对
暂存区
中的内容执行提交操作git commit
命令时,暂存区
的目录树写到版本库
中,master
分支会做相应的更新,即master
指向的目录树就是提交时暂存区的目录树- 3.当对暂存区中的内容执行回滚操作git reset HEAD 命令
- 3.当对版本库中的内容进行回滚 时,暂存区的目录树会被重写,被 master 分支指向的目录树所替换,但是工作区不受影响。
- 4.当执行 git rm --cached 命令时,会直接从暂存区删除文件,工作区则不做出改变。
- 5.当执行 git checkout . 或者 git checkout – 命令时,会用暂存区全部或指定的文件替换工作区的文件。这个操作很危险,会清除工作区中未添加到暂存区中的改动。
- 6.当执行 git checkout HEAD . 或者 git checkout HEAD 命令时,会用 HEAD 指向的 master 分支中的全部或者部分文件替换暂存区和以及工作区中的文件。这个命令也是极具危险性的,因为不但会清除工作区中未提交的改动,也会清除暂存区中未提交的改动
- 7.我们使用 git clone 从现有 Git 仓库中拷贝项目
- git clone
- git clone
- repo:Git 仓库。
- directory:本地目录
- 比如,要克隆 Ruby 语言的 Git 代码仓库 Grit,可以用下面的命令:
- $ git clone git://github.com/schacon/grit.git
- 执行该命令后,会在当前目录下创建一个名为grit的目录,其中包含一个 .git 的目录,用于保存下载下来的所有版本记录。
- 如果要自己定义要新建的项目目录名称,可以在上面的命令末尾指定新的名字:
- $ git clone git://github.com/schacon/grit.git mygrit
4.git忽略指定文件的提交
- 1.首先在git管理的文件夹根目录下创建一个名为.gitignore的文件
- 2.然后将需要忽略的文件都放在这里
- 3.注意:这种方式对应已经提交到git上面的文件石无法奏效的
- 4.例如在.gitignore文件添加到git之前,.project文件已经托管提交给git了,那后面在.gitignore这个文件里添加.project表示忽略这个文件也不行,git依然会提交
- 1.忽略某个已经托管给git的文件,防止二次提交
- 2.这种情况适用于,每个人修改了项目的配置,但是这个是临时的,只适用于自己本地的情况,不可提交给大家公用时,需要这么做
# 执行命令将文件加入不提交队列 git update-index --assume-unchanged 你的文件路径 # 执行命令将文件取消加入不提交队列 git update-index --no-assume-unchanged 你的文件路径
5.git提交忽略已加入版本库的文件
- 1.git rm --cached file
- 当我们需要删除暂存区或分支上的文件,同时工作区 ‘不需要’ 这个文件,可以使用 ‘git rm’
- 2.git rm file
- 3.git commit -m ‘delete file’
- 4.git push
- 当我们需要删除暂存区或分支上的文件,但是本地 ‘需要’ 这个文件,只是 ‘不希望加入版本控制’,可以使用 ‘git rm --cached’
- 1.git rm --cached file
- 2.git commit -m ‘delete remote file’
- 3.git push
3.3.基础配置
- 1.
Git
的设置一般使用git config
命令
- 1.显示当前
Git
的配置信息:git config --list
- 2.编辑
Git
配置文件信息
- 1.
git config -e
: 针对当前仓库- 2.
git config -e --global
: 针对系统上所有仓库$ git config --global user.name "runoob" #只对当前仓库有效 $ git config --global user.email test@runoob.com # 对所有仓库都有效
3.代码托管中心
- 1.代码托管中心是基于网络服务器的远程代码仓库,一般简称远程库
- 2.局域网:
GitLab
- 3.互联网:
GitHub
(外网),Gitee
码云(国内网址)
4.Git安装步骤
- 1.注意需要安装到非中文并且没有空格的目录下
- 2.安装后查看
Git
版本git --version
5.Git命令
5.1.设置用户签名
- 1.
git config --global user.name 用户名
:设置用户签名- 2.
git config --global user.email 邮箱
:设置用户签名
- 3.验证签名文件(进入电脑的本地用户中,查看
.gitconfig
信息)
- 4.用户签名的作用:区分不同成员身份,成员的签名信息在每一个版本的提交信息中能够看到,以此确认本次提交的来源,
Git
首次安装必须设置用户签名,否则无法提交代码- 5.注意:该设置用户签名和登录
GitHub
的账号没有任何关系
5.2.初始化本地库
- 1.基本语法
git init
- 2.初始化:
Git
管理目录获取Git
目录的管理权,且初始化后会在初始化的目录中生成隐藏的.git
文件夹,项目的快照数据
都存放在该文件夹中
5.3.查看本地库状态
- 1.基本语法
git status
- 2.说明
- 1.
第一行
:本地库在哪个分支- 2.
第二行
:还没有提交内容- 3.
第三行
:没有内容需要提交(红色表示还没有提交到暂存区)
5.4.添加暂存区
1.基本语法
git add . //将所有文件都添加到暂存区 git add *.c //将后缀为.c的文件添加到暂存区 git add 文件名 // 将指定文件添加到暂存区
2.将工作区中的文件添加到在暂存区(绿色表示已经提交到暂存区)
5.5.删除暂存区中的文件
- 1.基本语法
git rm --cached 文件名
- 2.该删除只是删除了暂存区中文件,而没有删除工作区中的文件
5.6.提交本地库
- 1.基本语法
git commit -m "日志信息" 文件名 //Linux系统中,commit信息使用单引号;Windows系统中,commit信息使用双引号
- 2.将暂存区的文件提交到本地库
- 3.noting to commit,working tree clean表示暂存区没有东西需要提交
- 4.一行删除,一行添加,表示修改,先删除掉再添加进去
5.7.历史版本
- 1.基本语法
git reflog //查看版本信息 git log //查看版本详细信息
5.7.1.查看历史记录
- 1.基本语法
git reflog
- 2.其中097e939和8d61690是7位简短版本号
5.7.2.查看日志
- 1.基本语法
git log
- 2.其中包括完全版本号,作者信息,日期和日志信息
5.7.3版本穿梭
- 1.基本语法
git reset --hard 版本号
- 2.进入Git版本目录文件的HEAD文件,指针指向master,说明当前是在master分支上
- 3.打开msater文件,该版本号指向第二个此修改历史记录,说明当前是在master分支下的第二修改版本
- 5.注意:Git切换版本,底层其实是移动的HEAD指针
6.Git分支
6.1.分支原理
- 1.版本控制过程中,同时推进多个任务,可以创建每个任务的单独分支
- 2.使用分支意味着程序员可以把自己的工作从开发主线上分离开来,开发自己分支的时候,不会影响主线分支的运行
- 3.分支底层其实也是指针的引用
- 4.master是主线分支,从master复制一份到feature-blue上进行开发,开发完后,提交到master
- 5.如果合并后导致问题,可以引入一个hot-fix(热修分支),把有问题的代码修改一下,如果没有问题再合并到master
6.2.分支好处
- 1.同时并行推进多个功能开发,提高开发效率
- 2.各个分支在开发过程中,如果某一个分支开发失败,不会对其他分支有任何影响,失败的分支删除重新开始即可
6.3.分支的操作
- 1.git branch -a:查看所有分支(本地和远程)
- 2.git branch:查看本地分支
- 3.git branch -r:查看远程分支
- 1.git branch -v:查看本地分支及最新的信息
- 2.git branch 分支名:创建分支
- 3.git chekout 分支名:切换分支
- 4.git merge 分支名:把指定的分支合并到当前分支上
6.3.1.查看分支
- 1.基本语法
git branch -v
6.3.2.分支创建
- 1.基本语法
git branch 分支名
6.3.3.分支切换及修改
- 1.基本语法
git checkout 分支名
- 说明:
- 1.master,hot-fix其实都是指向具体版本记录的指针
- 2.当前所在的分支,其实是由HEAD决定的,所以创建分支的本质就是多创建一个指针
- 3.HEAD如果指向master,那么现在就在master分支上
- 4.HEAD如果执行hotfix,那么现在就在hotfix分支上
- 5.所以切换分支的本质就是移动HEAD指针
6.3.4.分支合并
- 1.基本语法
git merge 分支名
6.3.5.代码合并冲突解决
- 1.合并分支时,两个分支在同一个文件的同一个位置有两套完全不同的修改
- 2.Git无法替我们决定使用哪一个,必须人为决定新代码内容
- 3.如下:master分支和hot-fix分支同时修改了同一个文件的同一处代码
- 4.查看状态(检测到有同一个文件的同一个位置有两处不同修改,产生冲突both modified)
- 5.此时需要手动修改该冲突文件,然后提交到合并文件中
7.Git团队协作机制
1.团队内协作
2.跨团队协作
3.fork(叉子):把所有代码作为一个分支复制过来
8.Idea集成Git
9.GitGub
- 代码托管中心
- 远程仓库操作
- git remote -v:查看当前所有远程地址别名
- git remote add 别名 远程地址:起别名
- git push 别名 分支:推送本地分支上的内容到远程仓库
- git clone 远程地址:将远程仓库的内容克隆到本地
- git pull 远程库地址别名 远程分支名:将远程仓库对于分支最新内容拉下来后与当前本地分支直接合并
1.创建远程仓库别名
git remote -v 查看当前所有远程地址别名 git remote add 别名 远程地址
2.推送本地分支到远程仓库
git push 别名 分支
- 注意需要认证,sign in即可
3.拉取远程库到本地库
- 远程拉取的会自动同步到本地库,不需要再次提交到本地库
克隆远程库到本地库Clone
- 克隆代码是不需要登录账号的,因为创建时是公共的,读权限是公共的
- clone会做如下操作
- 1.拉取代码
- 2.初始化本地仓库
- 3.创建别名
- 默认别名是origin
- 注意需要删除凭据管理
- 还需要对运行提交的人员进行授权
跨团队协作
SSH免密登录
文章来源:https://www.toymoban.com/news/detail-482133.html
- 进入该文件
- 公钥和私钥
- Idea集成GitHub
GitLab(基于局域网的代码托管中心)
1.简介
- 1.
GitLab
是一个仓库管理系统的开源项目,其使用Git
作为代码管理工具,并在此基础上搭建起来web
服务- 2.
GitLab
和GitHub
一样都属于第三方基于Git
开发的作品,免费且开源(基于MIT
协议)- 3.
Github
可以在远程服务器上注册用户,任意提交代码,添加SSHKey
等,而GitLab
可以部署到自己的服务器,数据等一切信息都掌握在自己手上,适合团队内部协作开发,简单来说可以把GitLab
看作个人版的GitHub
2.安装
- 1.参考
Linux软件安装
文章中Linux系统下安装GitLab
3.创建组/用户/项目
- 1.创建组
- 1.使用管理员
root
创建组,组里面可以创建多个项目分支- 2.将不同的开发添加到组里面并设置权限,不同的组就是公司不同的开发项目或者服务模块
- 3.不同的组添加不同的开发即可实现对开发设置权限的管理
4.上传代码
文章来源地址https://www.toymoban.com/news/detail-482133.html
Gitee码云(国内版本的GitGub)
- 码云创建远程库
- Idea集成Gitee码云
- 码云连接GitHub进行代码的复制和迁移
到了这里,关于版本控制-Git/SVN的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!