Git工具系列合集-骨灰级
了解课程
教程目录:
了解Git
Git概述
Git是一个免费开源的分布式版本控制系统
Git易于学习,占地面积小,性能极快。它具有廉价的本地库,方便的暂存区域和多个工作
流分支等特性。其性能优于Subversion. CVS、Perforce 和ClearCase等版本控制工具。
什么是版本控制?
如果遇到了这种情况,我们就需要使用到版本控制
为什么我们需要版本控制?
当团队协作开发代码的时候,我们需要有一个版本控制工具,统一合并每一个人的代码,而且保存每一个人分支的信息和提交的时间这个时候,GIT工具就是必须而且必要的了
版本控制工具
集中式的版本控制工具介绍
CVS、SVN(Subversion). VSS......
集中化的版本控制系统诸如CVS. SVN等,都有一个单一的集中管理的服务器,保存
所有文件的修订版本,而协同工作的人们都通过客户端连到这台服务器,取出最新的文件或
者提交更新。多年以来,这已成为版本控制系统的标准做法。
这种做法带来了许多好处,每个人都可以在一定程度上看到项目中的其他人正在做些什
么。而管理员也可以轻松掌控每个开发者的权限,并且管理一个集中化的版本控制系统,要
远比在各个客户端上维护本地数据库来得轻松容易。
事分两面,有好有坏。这么做显而易见的缺点是中央服务器的单点故障。如果服务器宕
机一小时,那么在这一小时内,谁都无法提交更新,也就无法协同工作。
分布式版本控制工具
Git、Mercurial、 Bazaar、 Darcs.....
像Git这种分布式版本控制工具,客户端提取的不是最新版本的文件快照,而是把代码
仓库完整地镜像下来(本地库)。这样任何一处协同工作用的文件发生故障,事后都可以用
其他客户端的本地仓库进行恢复。因为每个客户端的每一次文件提取操作,实际上都是一次
对整个文件仓库的完整备份。。
分布式的版本控制系统出现之后,解决了集中式版本控制系统的缺陷:
1.服务器断网的情况下也可以进行开发(因为版本控制是在本地进行的)
2.每个客户端保存的也都是整个完整的项目(包含历史记录,更加安全)
git工作原理
git命令
git常用命令速览
设置用户签名
安装好git之后,我们的右键菜单里面就多出了一个git选项,此时我们点击git Bash Here进入设置签名
使用git config命令设置用户名和邮箱
这个用户名和邮箱是为了区分用户之间提交的,必须要设置,不然无法提交代码
初始化工作区(本地库)
寻找到一个我们要作为工作区的目录,之后的每一次内容修改都会提交一次备份
-
首先我们需要找到一个这样的目录,然后在目录下面右键打开我们的git
-
在目录下面输入初始化命令的代码
git init
-
此时在我们的目录下面会生成一个隐藏的
.git
目录
查看本地库状态
使用命令
git status
就可以查看当前本地库的状态
On brance master 表示我们当前所处的分支
No commits yet 表示我们当前还没有提交过任何一次信息
nothing to commit 表示我们当前这个目录下的文件,如果有文件会提示可以提交,现在提示没有文件可以提交,因为我们这个目录是空的
此时我们创建一个hello.txt文件,并且在里面写上hello world
这个时候我们再使用git status命令查看我们的本地库
往暂存区里面添加文件
可以看到我们的第三行变了,大概意思就是多出了一个没有被追踪的文件,叫hello.txt,叫我们添加
此时我们可以使用
git add 文件名 // 把文件添加到暂存区
此时我们用下面这个命令就可以把文件添加进暂存区
git add hello.txt
此时我们再去查看我们本地库的状态就会发现我们的信息变了
从暂存区里删除文件
如果我想要从暂存区删除文件怎么办?
此时可以使用命令
git rm --cached 文件名字
就可以删除一个暂存区内的文件
可以看到,我们的hello.txt
又变成了没有被追踪的状态
虽然我们删除了暂存区缓存,但是我们的本地文件是不会发生任何变化的
使用命令
git commit -m "日志信息" 文件名字
来提交我们的文件,这个地方的-m “日志信息”
并非一定要填写,如果留空之后也会打开窗口让我们填写,所以为了方便我们还是在这个地方直接填写
如果我不加-m直接提交
最终还是逃不掉要写日志……
使用-m带参数提交
其中的4c106c7
就是我们的版本号
此时我们再使用git status
就可以看到
查看我们的日志信息
git log
这个命令可以帮助我们看到最近的更改以及日志信息和由谁更改
同时也可以使用我们的简短版命令,只看日志和版本号
git reflog
版本穿梭
使用命令
git reset --hard 版本号
就可以穿梭到版本号所在的文件版本
如果使用这个命令,那么本地文件也会被更新,回退或者前进到版本号所在的文件版本
更新文件后进行版本穿梭演示
首先,修改我们的hello文档
保存后退出
再次打开我们的git,查看我们当前库的状态
可以看到,git提示我们,有一个文件被更新了,这个时候我们再执行之前提交文件的步骤
git add hello.txt
现在已经添加到我们的暂存区了,这个时候我们再把它提交到本地库来生成版本号
git commit -m "这个是第二版" hello.txt
这个时候我们就会看到,git提示我们,有一个文件发生了变化,现在新增了一行,删除了一行
我们使用命令查看我们的当前的版本日志
git reflog
可以看到我们现在已经有两个版本了,同时我们的head
指针指向了我们第二版,我们需要穿梭回去只需要更改我们的指针就可以了,这个时候我们使用指令
git reset --hart 4c106c7
现在我们再去查看我们的文档信息
发现当前本地文件已经回滚到了第一次的更新前的样子
此时我们再去看看我们的git日志
可以看到我们现在的指针指向的是4c106c7,如果想要回到最新的版本,只需要重新使用命令让指针回到最新的版本号即可
git reset --hard 0c89054
可以看到我们现在又回滚回来了
git分支
什么是分支?
在版本控制过程中,同时推进多个任务,为每个任务,我们就可以创建每个任务的单独分支。
使用分支意味着程序员可以把自己的工作从开发主线上分离开来,开发自己分支的时候,不会影响主线分支的运行
对于初学者而言,分支可以简单理解为副本,一个分支就是
一个单独的副本。(分支底层其实也是指针的引用)。
操作分支的操作览
创建一个分支
使用下面命令就可以创建一个分支
git branch 分支名
显示结果
Administrator@PC-20200712XYQF MINGW64 /e/git-space (master)
$ git branch custom
创建分支并不会有过多的显示
查看我们的分支
使用下面命令查看我们的分支
git branch -v
显示结果
可以看到,我们现在多了一个名字叫custom
的分支,而且复制了我们主分支的所有内容
切换分支
使用下面命令切换
git checkout 分支的名字
可以看到当我们输入完指令之后,我们的括号内的分支已经变成了custom
我们现在查看我们的分支,可以看到,当前custom分支变成了绿色
在分支里面修改文件并且上传文件库
修改一下我们的文本文件
提交一下
查看一下我们的日志
我们这个时候还可以切换回去,如果切换回去,文件就会变成另一个分支上的文件
可以看到,当我们切换的时候,文件也变了
合并分支
我们想要合并分支需要先站在需要合并的主分支上面合并其他分支
比如:如果你想要把custom分支合并到master主分支里面
你需要先切换到master分支里面,然后使用命令
git merge 需要添加的分支名称
合并后的文件
可以看到当前文件的内容被改变了
合并分支冲突怎么办?
实际上的开发环境里面,经常会出现合并分支冲突的情况,这种情况是怎么发生的呢?
当你的文件里面存在除了你文件修改内容外的其他修改内容,那么我们就会出现合并分支冲突,听起来很拗口,我们来看一个例子
主分支-文件1:
你好
这个是我应该做的
主分支-文件1(修改后):
你不好
这个是我应该做的
提交之后显示1行添加1行删除,但是没有报错
此时我们切换到子分支
子分支-文件1:
你好
这个是我应该做的
值分支-文件1(修改后):
你好
这个谁爱做谁做
然后我们提交文件
切换会主分支,选择合并
就会出现错误
自动合并错误,有多个地方被修改,我们的git不知道该合并哪一个,这个时候我们再打开文件看看,发现文件变成了这样
此时我们可以看到冲突为什么发生,此时我们选择需要保留的内容,然后删除其他多余的=,>,<让文本变成这样
这里我选择保留下一句(当然你两个都保留也是可以的)
注意,这个时候,我们需要再提交文件,但是不能在提交本地库的时候加上文件名字
正常添加文件进暂存区
git add 文件1.txt
不能加上名字,然后提交本地库
git commit -m "合并冲突解决"
如果我在提交的时候还是加上了提交文件的名字会发生什么?
没有合并成功,并且报错了,此时我们需要输入
git commit -m "合并冲突"
可以看到,此时我们就合并成功了
同时,我们合并后只会修改主分支,子分支不会收到影响
使用github远程库
团队内协作
图片讲解
push 把本地库上传到远程库
clone 把远程库的内容下载到本地
pull 把远程库的内容拉取到本地(类似合并分支,不会下载全部)
跨团队协作
图片详解
对方可以使用fork将代码保存到自己的远程库中
然后在自己的远程库里面使用clone和push等操作,等一切都做完之后
使用pull requests,发起一个拉取请求,求求源代码的主人接受代码,然后代码的主人需要勉为其难的merge审核通过一下,才会保存到源代码的远程库下,成为正统
新建一个仓库
团队内协作
用https来操作我们的远程库
因为链接太长了,同时不方便我们记忆和输入,所以我们可以给链接一个别名,这样我们之后都可以使用别名来快速的代指这个链接
查看当前本地库的别名
使用下面命令
git remote -v
可以看到此时我们还没有别名
创建一个别名
使用下面命令
git remote add 别名(建议和本地库同名) 链接地址
在这里我们使用
git remote add git-space https://github.com/271374667/git-space.git
此时,我们可以看到,现在已经有两个别名(一个推送一个拉去)
把我们的代码发送到远程库
使用命令
git push 链接或者链接的别名 分支
在这里我们使用
git push git-space master
出现了证书错误?
这个时候只需要重新配置一下git的配置,把证书验证给关了
使用命令
git config --global http.sslVerify false
此时,就会弹出一个方框让我们登陆
从远程库拉取文件到目录
我们使用命令
git pull 链接或者链接的别名 分支
我们这里直接使用
git pull git-space master
拉取的动作会自动帮我们提交本地库
从远程库里完整下载文件到本地库
使用命令
git clone 链接
clone代码的时候不需要登陆
clone代码干了3件事情
- 下载完整代码
- 初始化本地库
- 创建别名
这里不再演示
如果想要多人协作需要先邀请对方
被邀请方
跨团队协作
使用fork拷贝对方的远程库
这个时候,其他人就可以在自己的远程库里使用pull和push
把迭代后的代码回归原工程
点击上面的Pull requests
点击新建一个request
确定创建
填写信息
此时,原代码的工程那边就能看到一个pull requests
确认无误之后同意回归
使用SSH免密登陆
可以看到,此时我们还没有SSH配置公钥
生成一个SSH的key
切换我们的目录到
C:\Users\Administrator
然后在这个目录下面打开我们的git图形界面
使用命令,注意这个-C是大写的C
ssh-keygen -t rsa -C 邮箱
此时我们输入
ssh-keygen -t rsa -C 271374667@qq.com
然后什么都不用管,连续敲三次回车
此时现在就生成了一个.ssh
文件
打开我们的id_rsa.pub
然后复制里面所有的内容
粘贴到我们得github中
使用SSH拉取代码
语法:
git ssh链接 分支
在这里我们输入
git pull git@github.com:271374667/git-space.git master
此时出现窗口,询问我们是否保存,方便之后登陆,我们选择yes
可以看到我们现在已经成功的通过ssh来免密登陆并且获取内容了
出现22端口报错怎么办?
vim ~/.ssh/config
Host github.com
Hostname ssh.github.com
Port 443
输入完记得输入:wq
来保存并且退出
使用SSH来push代码到远程库
使用命令
git push ssh链接 分支
这里我们使用
git push git@github.com:271374667/git-space.git master
使用国内的gitee(在vscode上)
简介
gitee是中国内的代码托管平台,所以速度会比github快很多,也不会出现突然之间暴毙或者登陆补上的情况
使用方法
如果你使用git自带的界面,那么操作和之前是一样的,只不过创建仓库之后的链接会发生变化,但是我们现在主要讲的不是这个,而是在vscode中的配置
在vscode中的配置
我们在vscode中可以直接登录到github,但是因为github是一个外国的网站,所以网速很慢,而且有的时候还时不时的会崩坏,但是没关系,我们现在可以快速的在vscode里面使用我们的gitee,甚至就和上传到github一样简单
创建一个新的仓库
比如我这里新建了一个仓库名字叫做git-tutorial
然后点击仓库之后复制我们的https
在vscode的远程库里添加一个远程库
随后我们输入我们的url
注意,这个地方会要求我们输入库的名字
请不要随意输入,会导致上传失败,经过测试origin是一个可用 的名字
随后就可以开始使用了,在vscode上面使用git非常的简单便捷,而且高效