Git是一个免费的,开源的分布式版本控制系统,可以快速高效地处理从小型到大型的项目。
Git易于学习,占地面积小,性能模块。它具有廉价的本地库,方便的暂存区域和多个工作流分支特性。
版本控制是一种记录文件内容变化,以便将来查阅特定版本修订情况的系统。
版本控制最重要的是可以记录文件修改历史记录,从而让用户能够查看历史版本,方便版本切换。
集中式版本控制工具
集中化的版本控制系统诸如CVS、SVN等,都有一个单一的集中管理的服务器,保存所有文件的修订版本,而协同工作的人们都通过客户端连接这台服务器,取出最新的文件或者提交更新。
这种做法带来了许多好处,每个人都可以在一定程度上看到项目中的其他人正在做些什么,而管理员也可以轻松掌握每个开发者的权限,并且管理一个集中化的版本控制系统,要远比在各个客户端上的维护本地数据库来得轻松容易。
显而易见的缺点是中央服务器的单点故障,如果服务器宕机,在宕机的一段时间内,谁都无法提交更新,也就无法协同工作。
在收集个人信息时,通常多人可同时编辑的表格软件,每个人都可以看到其他人的实时填写信息,管理员可赋予填写人权限, 是一个集中化的版本控制系统。
分布式版本控制工具
像Git这种分布式版本控制工具,客户端提取的不是最新版本的文件快照,而是把代码仓库完整地镜像下来(本地库),这样任何一处协同工作用的文件发生故障,事后都可以用其他客户端的本地仓库进行恢复。因为每个客户端的每一次文件提取操作,实际上都是一次对整个文件仓库的完整备份。
分布式的版本控制系统出现之后,解决了集中式版本控制系统的缺陷:
1.服务器断网的情况下也可以进行开发(因为版本控制是在本地进行的)
2.每个客户端保存的也都是整个完整的项目(包含历史记录,更加安全)
使用过学习通的话,在小组作业中提交word文档时,由本地上传到当中,每个人都可以将已提交的文件重新进行编辑,生成多个版本的文件,体现出分布式版本控制的思想。
命令名称 | 作用 |
---|---|
git config --global.user.name 用户名 | 设置用户签名 |
git config --global.user.email 邮箱 | 设置用户签名 |
git init | 初始化本地库 |
git status | 查看本地库状态 |
git add 文件名 | 添加到暂存区 |
git commit -m ”日志信息“ 文件名 | 提交到本地库 |
git reflog | 查看历史记录 |
git reset-hard 版本号 | 版本穿梭 |
git config --global.user.name 设置用户签名
git config --global.user.email 设置用户邮箱
设置的用户名和邮箱地址就已经添加到了配置文件中
签名的作用是区分不同操作者身份。用户的签名信息在每一个版本的提交信息中能够看到,以此确认本次提交是谁做的。Git首次安装必须设置一下用户签名,否则无法提交代码。
这里设置用户签名和将来登录GitHub(或其他代码托管中心)的账号没有任何关系,是一个虚拟的设置。
要用git管理目录的话,首先得让git获取目录的管理权,也就是初始化git
在D盘Git-space文件下新建git-demo项目,用git管理该项目,git没有该项目的管理权限,需要用 git init 初始化git
生成的.git目录在windows环境下是默认隐藏,在查看方式下勾选隐藏的项目可以显示出来
文件内容是空的,因为.git文件是隐藏的,无法显示,在Linux下添加一个参数,指令为ll -a即可查看
这样就模拟写了一个代码,shift+":"进入到末行模,,输入wq保存该文件
hello.txt文件创建成功
然后再次查看本地库状态
文件被git追踪到,文件被添加到了暂存区,此时的文件就是一个历史版本,暂存区的文件可以被删除
再次查看本地库状态
hello.txt变为未追踪状态,说明只是暂存区的文件被删除
修改文件中第一行的内容并保存,查看本地库状态
显示本地库状态已被修改,本次文件修改没有被添加到暂存区,将本次修改的文件添加到暂存区
修改后的文件被添加到暂存区
在这里提示一行新增,一行删除,在git里是按照行来维护文件的,修改一行在这里的意思是把修改之前的内容删掉,将修改之后的内容添加进来
流程为:文件修改—>添加到暂存区—>提交到本地库—>查看版本信息
只要工作区的文件修改就会产生新的暂存区文件,将修改多次后的文件通过存放在暂存区并提交到本地库,就可以保留文件的多个版本,体现出了git的分布式版本控制功能。
查看历史版本
● git reflog 查看版本信息
● git log 查看版本详细信息
可以明显的看到项目经过了几个版本的更替,版本号,以及当前指针指向的版本
如果感觉当前新的版本写的不好,想找回到之前的版本,是支持版本穿梭的
git reset-hard +版本号 实现版本穿梭
可以看到指针指向本地库的master分支
如果想要知道是在master分支的哪个版本,可以查看refs文件目录
打开master文件,里面记录了master分支指向的第一个版本完整的版本号
GIt控制版本,并不是制造了多个副本来实现,而是在本地库的内容里记录了多个日志,通过调用指针指向不同的版本
头指针指向master分支,master分支指向first版本
而后又提交了Second版本,master指向Second版本
master是分支,每个分支指向一个版本,head是当前指针,指针指向master分支
在版本控制过程中,同时推进多个任务,为每个任务,我们就可以创建每个任务的单独分支。使用分支意味着工作者可以把自己的工作从开发主线上分离开来,开发自己分支的时候,不会影响主线分支的运行。分支可以简单理解为副本,一个分支就是一个单独的副本。(分支底层也是指针的引用)。
分支的好处
同时并行推进多个功能开发,提高开发效率。
各个分支在开发过程中,如果某一个分支开发失败,不会对其他分支有任何影响。失败的分支删除重新开始即可。
分支的操作
命令名称 | 作用 |
---|---|
git branch 分支名 | 创建分支 |
git branch -v | 查看分支 |
git checkout 分支名 | 切换分支 |
git merge 分支名 | 把指定的分支合并到当前分支上 |
git branch -v
git branch 分支名
git checkout 分支名
当前切换到了hot-fix分支
切换到master分支
现在将两个分支合并起来——git merge 分支名
hot-fix分支是基于master分支添加了一些内容,不会产生合并的冲突
冲突产生的原因
合并分支时,两个分支在同一个文件的同一位置有两套完全不同的修改,Git无法替我们决定使用哪一个,必须人为决定新代码内容。
在master分支上合并hot-fix分支
查看本地库状态
手动合并后的文件需要再次添加到暂存区,提交至本地库(此时使用git commit命令时不能带文件名)
分支合并成功
当前所在分支,是由HEAD决定的。创建分支的本质就是多创建一个指针
命令名称 | 作用 |
---|---|
git remote -v | 查看当前所有远程地址别名 |
git remote add 别名 远程地址 | 起别名 |
git push 别名 分支 | 推送本地分支上的内容到远程仓库 |
git clone 远程地址 | 将远程仓库的内容克隆到本地 |
git pull 远程库地址别名 远程分支名 | 将远程仓库对于分支最新内容拉下来后与当前本地分支直接合并 |
在github中创建远程库,远程库的名称与本地库的名称相同
远程库链接用于拉取和推送代码
起别名是为了方便后期使用
为了方便记忆,在起别名时建议和库名保持一致
在这里出现两个别名,一个使拉取代码用的别名,而另一个是推送代码时使用的
成功的推送了远程端github上
对远程库的文件中的内容进行修改
此时远程库和本地库的数据已经不一致,需要更新本地库的数据,就需要从远程库进行拉取
本地库状态没有显示任何修改,拉取状态会自动提交本地库
与远程库中的数据保持一致,对本地库进行了更新,远程库和本地库保持同步
D盘下新建git-clone文件
公共库的读权限是没有限制的,任何人都可以查看内容
别名自动变为了origin
在clone远程库时会做以下内容
1.拉取代码
2.初始化本地库
3.创建别名
在克隆远程库除了HTTPS链接,还有SSH链接
这里显示 GitHub 帐户中没有任何公共 SSH 密钥。您可以添加新的公钥,或尝试通过 HTTPS 克隆此存储库。
需要获取新的公钥
利用非对称加密协议算法生成.ssh文件