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:///schacon/grit.git执行该命令后,会在当前目录下创建一个名为grit的目录,其中包含一个 .git 的目录,用于保存下载下来的所有版本记录。如果要自己定义要新建的项目目录名称,可以在上面的命令末尾指定新的名字:$ git clone git:///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 file3.git commit -m ‘delete file’4.git push当我们需要删除暂存区或分支上的文件,但是本地 ‘需要’ 这个文件,只是 ‘不希望加入版本控制’,可以使用 ‘git rm --cached’1.git rm --cached file2.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@ # 对所有仓库都有效
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上进行开发,开发完后,提交到master5.如果合并后导致问题,可以引入一个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免密登录
进入该文件
公钥和私钥
Idea集成GitHub
GitLab(基于局域网的代码托管中心)
GitLab服务器的搭建和部署Idea集成GitLab
Gitee码云(国内版本的GitGub)
码云创建远程库Idea集成Gitee码云码云连接GitHub进行代码的复制和迁移