点赞👍👍收藏🌟🌟关注💖💖
你的支持是对我最大的鼓励,我们一起努力吧!😃😃
1.理解分布式版本控制系统
我们目前所说的所有内容(工作区,暂存区,版本库等等),都是在本地!也就是在你的笔记本或者服务器上上。而我们的 Git 其实是分布式版本控制系统!什么意思呢?
之前我们学过分支,Git提供给我们的分支能力有几个好处,首先除了默认的master分支,还支持我们创建本地的dev分支,有了创建分支的能力,我们就没有必要在master分支上进行功能的开发了,而是在本地分支上进行功能的开发,并且可以在本地分支上可以进行测试等,所以导致我们创建出来的分支是不稳定的,而我们把本地分支的问题都解决后,合并到master分支上,所以master分支上跑的都是稳定的代码。这是分支带给我们的好处。
还有个好处是Git既然提供给我们创建多个分支,那么我们在一个项目中就可以让多个开发人员参与进来进行开发,每一个人都可以创建属于自己的分支,在自己的分支上进行功能的开发。最后把自己的分支和master合并,有冲突把冲突解决一下即可。这样就做到多人协作开发的目的。就不用一个人管一个项目,吭哧吭哧的开发了。
但是多人协作开发并不是仅有分支就能解决的,master分支还有其他的分支的操作其实都是在本地仓库完成的。在本地仓库完成对应的只是一台服务器,如果我们要进行多人开发,我们多个人是在一台服务器上开发吗?3-5人你在你的分支上开发一会,我在我的分支上开发一会。那这样多人协作开发不但没有提示效率,反而降低效率。
现在我们开发人员几乎人手一台电脑,我们肯定是希望在自己的电脑上去进行开发。有了这么一个问题,Git给我们提供了一个解决方案。
既然每个人都想在自己的电脑上开发,那么就让每个人的电脑上都拥有一个独立且完整的仓库。
那么这个时候怎么进行多人协作开发呢?也就是你的电脑怎么看到其他人修改了什么内容呢?
很简单,你的同事只要修改了内容就把修改的内容推送给你,这个时候你就能看到它电脑上仓库的改动,同样你也是这样。这样有一些好处,对于安全性来说提高了很多,比如说之前在一台电脑如果电脑损坏了仓库就丢失了,这样时候不管是你们谁的电脑坏了,在其他人的电脑上其实都可以存在完整的仓库。我们直接从其他人的电脑上把仓库复制一份就可以了。但是呢如果你们不在一个局域网,电脑直接访问不了,这个时候没有办法推送。还有你的同事生病了它没有开电脑,你也推送不了。所以这种方式也不是最终的版本,也存在一些问题。
Git又给了一个方案,提供了一个 中央服务器 ,中央服务器有也自己的仓库。让这个中央服务器保持24小时开机。所有要进行多人协作都是和这台中央服务器打交道。那么其他人怎么和中央服务器进行一个交互呢?
每个人的服务器都可以克隆一份中央服务器的仓库到自己的电脑上,让我们拥有一份和中央服务器一样的仓库,接下来在自己电脑的本地仓库进行修改之后可以推送到中央服务器的仓库,如果其他人想看这次修改的话,其他人就可以从中央服务器上拉取到对应的修改。
所以我们看到中央服务器的作用其实仅仅是为了方便进行交换修改的,有了这个中央服务器之后就不怕某个人的电脑出现问题,只要中央服务器还在,我们的代码就在。
中央服务器的仓库是一个远程仓库。
我们完全可以搭建一台运行 Git 的服务器,不过现阶段,为了学 Git 先搭个服务器绝对是小题大作。好在这个世界上有这么一些大佬,就创建了这样一个叫 GitHub 的神奇的网站,从名字就可以看出,这个网站就是提供 Git 仓库托管服务的,所以,只要注册⼀个GitHub账号,就可以免费获得 Git 远程仓库。当然,github是国外的网站,速度比较慢一点);国内也有 gitee网站,也起到类似的作用。
到这里我们就理解了Git它是分布式版本控制系统到底是什么意思,它其实不是本地的版本控制系统,而是分布式版本控制系统,也就是我们可以在多台机器上进行推送和拉取操作,这些操作和本地无关。这些我们都可以称为分布式版本控制的内容。
2.新建远程仓库
新建远程项目仓库:
填写基本信息:
初始化仓库如果没有需要可以不选,.gitignore下面再说。
设置模板我们可以都选上,ReadMe文件里面写的是仓库的里面主要的内容是什么。Issue模板文件,Pull Request模板文件,我们后面说。
目前分支模型我们选只有master分支的,还有其他分支模型我们后面在说。
创建成功:
我们看到master后面跟的是分支,这个分支和我们之前学的分支是一样的,只不过我们之前学的是本地分支,这里的是远程分支。
这里ReadMe文件就是我们选择的ReadMe文件模板
我们还选了两个模板,它俩放在了.gitee文件夹里
Issue模板文件,Pull Requests模板文件就是对应下面两个
点击新建Issue
可以看到有对应的模板消息,所以这个Issue是让有问题的人与当前仓库人员进行交流的地方。
对于我们开发者来说我们肯定不是在master分支上进行开发,我们要在自己创建的分支下进行开发,比如说dev。当开发完了我们想让master来合并dev分支。这个merge操作其实是非常危险的,你怎么知道你开发的代码没有bug呢?不会影响master代码呢?实际上我们会让开发者直接merge dev分支的,这个时候我们的开发者要提交一个Pull Requests(进行合并的申请单),在这里说明你为什么合并等等都要写在这个申请单里面。这个申请单是给仓库管理员看的,一旦管理员同意了,然后才能将自己的代码merge到master。这个merge操作并不是我们自己做的而是在gitee上合并的。
3.克隆远程仓库
SSH 协议和 HTTPS 协议是 Git 最常使用的两种数据传输协议。SSH 协议使用了公钥加密和公钥登陆机制,体现了其实用性和安全性,使用此协议需要将我们的公钥放上服务器,由 Git 服务器进行管理。使用 HTTPS 方式时,没有要求,可以直接克隆下来。
HTTPS
克隆远程仓库使用git clone 命令,注意不能在有本地仓库的目录克隆。
git clone [链接]
通过克隆我们现在除了有远程仓库还有克隆下来的本地仓库,这个本地仓库和我们前面学的本地仓库是一模一样的。其中这个origin是远程仓库的名字。
查看远程仓库的信息
git remote
查看远程仓库的更为详细的信息
git remote -v
push代表推送,fecth代表拉取,打印出这两个代表当前本地仓库拥有和远程仓库推和拉权限。我们把远程仓库克隆下来之后所有的操作肯定都在本地仓库完成,本地提交的修改推送到远端就要使用push权限。如果此时远程仓库中存在着本地没有的代码我们就需要拉了就要使用fetch权限。
SSH
使用SSH必须要将本地服务器上的公钥放到gitee服务器上进行管理。才能克隆成功。
在设置里面查看SSH公钥,目前我们是配置SSH公钥的。
没有配置公钥直接克隆发现是不可以的,
配置公钥:
第一步:创建SSH Key。在用户主目录下,看看有没有.ssh目录,如果有,再看看这个目录下有没有id_rsa 和 id_rsa.pub 这两个文件,如果已经有了,可直接跳到下⼀步。如果没有,需要创建SSH Key:
目前我们是没有这两个文件的
生成这两个文件
ssh-keygen -t rsa -C "自己的邮箱"
注意要输入自己的邮箱,这里的邮箱要和gitee上面的邮箱保持一致!然后一路回车,使用默认值即可
顺利的话,可以在用户主目录找到 .ssh 目录,里面有 id_rsa 和 id_rsa.pub 两个⽂件,这两个就是SSH Key的秘钥对, id_rsa 是私钥,不能泄露出去, id_rsa.pub 是公钥,可以放心地告诉任何人。
第二步:添加自己的公钥到远端仓库。
将公钥复制到这里,点击确定即可。
多人协作开发用的都是SSH协议,就把自己本地服务器上的公钥都配置进来。
再次克隆就没有问题了
当我们从远程仓库克隆后,实际上 Git 会自动把本地的 master 分支和远程的 master 分支对应起来。 这有什么用后面说。
4.向远程仓库推送
远程仓库已经成功克隆到本地了,那如何将本地仓库中的修改推送到远程仓库中呢?
我们先梳理一下流程,我们肯定是在本地的工作区做修改,然后使用 add 操作将工作区修改的内容放到暂存区中,然后使用 commit 操作将暂存区的内容提交到本地仓库master分支(目前就以master为例)。给master分支进行一次新的提交, 它就有了一次新的修改了,但是远程仓库是看不到本地仓库的修改的。本地仓库必须要进行一次push推送操作。push将本地仓库比如说master分支的修改推送到远程仓库的master分支下。所以push操作是分支和分支之间的交互。
注意我们之前说过,有了本地仓库之后,首先要做的是要做一下配置,
git config -l
如果我们之前设置过全局的 name 和 e-mail,这两项配置需要和 gitee 上配置的用户名和邮箱一致,否则会出错。或者从来没有设置过全局的 name 和 e-mail,那么我们第一次提交时也会报错。这就需要我们重新配置下了,同样要注意需要和 gitee 上配置的用户名和邮箱⼀致。如何配置已讲过,在这里就不再赘述。
目前我们现在master分支下,增加一个file.txt文件,然后将它推送到远程仓库
以前我们commit之后,查看当前仓库状态只会显示最后面一行内容。但是我们现在是克隆下来的远程仓库,它新增了一点内容,它建议我们使用git push将本地提交就行推送操作,推送到远程仓库origin下的master分支。
git push 命令,该命令用于将本地的分支版本上传到远程并合并,命令格式如下:
git push <远程主机名> <本地分⽀名>:<远程分⽀名>
# 如果本地分⽀名与远程分⽀名相同,则可以省略冒号:
git push <远程主机名> <本地分⽀名>
推送成功!这里由于我们使用的是 SSH 协议,是不用每一次推送都输入密码的,方便了我们的推送操作。如果你使用的是 HTTPS 协议,有个麻烦地方就是每次推送都必须输入口令。
查看远程仓库,发现我们确实推送成功了。
推送是远程分支和本地分支之间进行的交互,所以我们必须让两个分支进行连接,成立一个关系,有这个关系才能成功push。对于远程仓库和本地仓库的master分支来说,在克隆的时候Git会自动帮我们建立联系,所以master我们直接push就成功了。
5.拉取远程仓库
如果远程仓库的内容是领先于本地仓库的话,这个时候是本地仓库想要看到远程仓库中最新的代码,这个时候我们就要进行一个pull操作,将远程仓库最新的内容拉取到本地仓库。
在 gitee 上点击 file.txt 文件并在线修改它,此时,远程仓库是要领先于本地仓库一个版本,为了使本地仓库保持最新的版本,我们需要拉取下远端代码,并合并到本地。
Git 提供了 git pull 命令,该命令用于从远程获取代码并合并本地的版本。格式如下:
git pull <远程主机名> <远程分⽀名>:<本地分⽀名>
# 如果远程分⽀是与当前分⽀合并,则冒号后⾯的部分可以省略。
git pull <远程主机名> <远程分⽀名>
可以看到成功拉取并且合并了。
6.配置 Git
忽略特殊文件
在日常开发中,我们有些文件不想或者不应该提交到远端,比如保存了数据库密码的配置文件,那怎么让 Git 知道呢?
可以在 Git 工作区的根目录下创建⼀个特殊的 .gitignore 文件,然后把要忽略的文件名填进去,包含在.gitignore 文件的这些文件,是不被Git所追踪管理的,所以add
的时候Git 就会自动忽略这些文件了。
还有 gitee 在创建仓库时就可以为我们生成.gitignore 文件,不过需要我们主动勾选一下:把不需要从头写 .gitignore 文件。
如果当时没有选择这个选择,在工作区创建一个也是可以的。无论哪种方式,最终都可以得到一个完整的 .gitignore 文件,例如我们想忽略以 .so 和 .ini 结尾所有文件, .gitignore 的内容如下:
查看当前仓库状态,发现只有显示 .gitignore文件,并没有看到新增的a.so文件,这就是因为外面在.gitignore文件进行了配置把所有以.so为结尾的文件都让git不要去追踪管理。
如果就不想让b.so文件被忽略,怎么办呢?
有两种做法,第一种方法:
强制将被忽略的文件进行添加
git add -f [文件]
我们还是期望不要去破坏.gitignore文件的规则,所以可以用第二种方法:
把指定文件排除在 .gitignore 规则外
假设.gitignore里面已经添加过很多要忽略的文件,然后有一天创建了一个d.so文件,我们想要查看一下d.so为什么会被忽略,怎么办呢?
git check-ignore -v [文件]
这里我们就看到d.so被忽略的原因是在.gitignore文件第一行有一个*.so。
7.配置命令别名
在我们使用 Git 期间,有些命令敲的时候着实让人头疼(太长了。。),幸运的是,git支持对命令进行简化!
举个例子,将 git status 简化为 git st ,对应的命令为:
git config --global alias.st status
–global 参数是全局参数,也就是这些命令在这台电脑的所有Git仓库下都有用。如果不加,那只针对当前的仓库起作用。
8.标签管理
标签 tag ,打标签顾名思义是对某个事物进行一个标识,在Git中可以简单的理解为是对某次 commit 的一个标识,相当于起了一个别名。
例如,在项目发布某个版本的时候,针对最后一次 commit 起一个 v1.0 这样的标签来标识里程碑的意义。
还有之前在学习版本回退的时候,我们要使用的commit id,相较于难以记住的 commit id , tag 很好的解决这个问题,我们可以给重要的提交打个标签,那我们直接查这个标签就可以找到commit id,最后就可以使用这个commit id 进行版本回退。
8.1创建标签
在Git中打标签非常简单,首先,切换到需要打标签的分支上,然后,敲命令 git tag [name] 就可以打一个新标签:
默认给最新的一次提交打标签
git tag [标签]
查看所有标签
git tag
可以看到确确实实增加了一个标签,并且里面存的是最新一个提交的commit id
默认标签是打在最新提交的 commit 上的。那如何在指定的commit上打标签呢?方法是找到历史提交的commit id,然后打上就可以了。
git tag [标签] [commit id]
那现在只是有这一个标签了,但是想针对某个标签添加一些描述,在未来查看的时候好知道这个是什么。
git tag -a [标签] -m "描述" [commit id]
注意,标签不是按时间顺序列出,而是按字目排序的。
可以用 git show [tagname] 查看标签信息。
git show [标签]
8.2操作标签
如果标签打错了,也可以删除:
git tag -d [标签]
因为目前创建的标签都只存储在本地,不会自动推送到远程。所以,打错的标签可以在本地安全删除。
如果要推送某个标签到远程,使用命令
git push origin [标签]
也可以一次性推送所有标签到远程
git push origin --tags
如果标签已经推送到远程,要删除远程标签就麻烦一点,先从本地删除:
git tag -d [标签]
然后,从远程删除。删除命令也是push,但是格式如下:
git push origin :refs/tags/v1.0