目录
理解分布式版本控制系统
远程仓库
新建远程仓库
lssue 与 Pull Request模板文件
知识铺垫
lssue 模板文件
Pull Request模板文件
克隆远程仓库
使用 HTTPS 方式
使用 SSH 方式
第一步:创建SSH Key
向远程仓库推送
过程梳理
实操
拉取远程仓库
配置 Git
忽略特殊文件
给命令配置别名
理解分布式版本控制系统
我们目前所说的所有内容(工作区,暂存区,版本库等等),都是在本地!也就是在你的笔记本或者计算机上。而我们的 Git 其实是分布式版本控制系统!可以简单理解为,我们每个人的电脑上都是⼀个完整的版本库,这样你工作的时候,就不需要联网了,因为版本库就在你自己的电脑上。既然每个人电脑上都有⼀个完整的版本库,那多个人如何协作呢?比方说你在自己电脑上改了文件A,你的同事也在他的电脑上改了文件A,这时,你们俩之间只需把各自的修改推送给对方,就可以互相看到对方的修改了。
远程仓库
找⼀台电脑充当服务器的角色,每天24小时开机,其他每个人都从这个 “服务器” 仓库克隆⼀份到自己的电脑上,并且各自把各自的提交推送到服务器仓库里,也从服务器仓库中拉取别⼈的提交。 有一个叫 GitHub 的神奇的网站,从名字就可以看出,这个网站就是提供 Git 仓库托管服务的。所以,只要注册⼀个GitHub账号,就可以免费获得 Git 远程仓库。github是国外的网站,速度比较慢,在国内还有码云来托管代码。(此处以码云为例)
新建远程仓库
新建远程项目仓库。
填写基本信息,一般一个仓库对应着的都是一个项目系统,而项目系统的名字其实就是仓库的名字,所以在这里的仓库命名一定要围绕着系统要做什么来命名。
上述不重要详细后续讲解,默认不勾选即可。
这个是当我们创建好一个仓库之后,会自动在这个仓库当中创建添加的文件。
- Readme 文件:用于写一些仓库中主要的、详细内容。
- 两个模板文件后续讲解。
此时,创建出来就会如下所示:
远程仓库中,经过我们的勾选,反别创建了英文版与中文版的resdme文件,其中会默认为我们创建一个模板,为我们仓库中的项目起一个介绍的作用。
lssue 与 Pull Request模板文件
然后在 gitee 中还创建了我们勾选的两个模板文件。
lssue模板文件其实就是一个模板。
Pull Request 模板文件一样的,是一个模板。
知识铺垫
首先我们创建出来的仓库是可以设计成员的,也就是谁可以在这个仓库里进行开发。
也可以设置对应的用户角色。
如果对于角色不清楚,可以通过点击进行详细的了解。所以远程仓库是有其对应的成员的。
lssue 模板文件
可以发现上述有一个,通过添加。
可以发现正文里面的内容,刚好和我们之前在 .gitee 中点开的是一样的模板内容。这个 lssue 就是让有问题的人与当前仓库的人员进行交流的地方。
Pull Request模板文件
可以发现上述有一个,通过添加。
之前有所提过,我们想要在一个仓库当中进行一定的开发,我们并不是在 master 上进行开发的(这是对于我们开发者来说的),而是在其他分支上进行开发的,比如说:dev分支。这个时候我们在 dev 分支上开发完了,我们是想在 master 分支上 merge dev 分支的。所以对应的合并操作,其实是一个非常危险的操作,因为无法保证上传的代码是完全没有问题的,所以如果是直接将 dev 合并到 master 上是不被允许的。
正确的做法是,开发者要提一个 PR(Pull Request) 。可以理解为是一个合并的申请单,在这个申请单里面要说明,为什么要进行合并,给到仓库管理员看。一旦管理人员同意了,我们才可以进行对应的合并操作。
克隆远程仓库
克隆/下载远端仓库到本地,需要使用 git clone 命令,后面跟上我们的远端仓库的链接,远端仓库的链接可以从仓库中找到。
其中我们最常用的还是 HTTPS 和 SSH 。
使用 HTTPS 方式
其是在克隆的时候没有任何的要求的,直接使用该链接克隆即可。
Note:想要执行克隆的时候,不能在任意一个本地仓库进行执行。
[qcr@ecs-205826 ~]$ git clone https://gitee.com/chuanru/remote---project.git
Cloning into 'remote---project'...
remote: Enumerating objects: 7, done.
remote: Counting objects: 100% (7/7), done.
remote: Compressing objects: 100% (7/7), done.
remote: Total 7 (delta 0), reused 0 (delta 0), pack-reused 0
Unpacking objects: 100% (7/7), done.
可以进行对应的查看。
[qcr@ecs-205826 ~]$ cd remote---project/
[qcr@ecs-205826 remote---project]$ ls -a
. .. .git .gitee README.en.md README.md
克隆下来的仓库有一个默认名:origin,可以在当前仓库中使用 git remote 命令进行查看。
[qcr@ecs-205826 remote---project]$ git remote
origin
如果想看更加详细的远端信息,可以通过添加 -v 选项。
[qcr@ecs-205826 remote---project]$ git remote -v
origin https://gitee.com/chuanru/remote---project.git (fetch)
origin https://gitee.com/chuanru/remote---project.git (push)
可以发现一个为 fetch拿、push推,这两个代表的是我当前本地仓库拥有和远程仓库的拿和推的权限。
使用 SSH 方式
使用的是公钥加密和公钥登录的机制,体现的是实用性和安全性,如果我们想要使用 SSH 提供的链接进行对应的克隆操作,必须先要将本地的公钥,存到 gitee 的服务器上。
查看 gitee 上配置的公钥:
在左边的设置框里面就可以看到。
如果为上述,则证明没有配置任何的公钥。这种情况下,直接对 SSH 提供的地址进行 git clone 操作是会出现问题的。
[qcr@ecs-205826 ~]$ git clone git@gitee.com:chuanru/remote---project.git
Cloning into 'remote---project'...
Warning: Permanently added 'gitee.com,212.64.63.215' (ECDSA) to the list of known hosts.
Permission denied (publickey).
fatal: Could not read from remote repository.
Please make sure you have the correct access rights
and the repository exists.
其会提示我们权限不足,没有办法读取远程的仓库。这个错误就是没有在 gitee 服务器上去配置本地服务器的公钥。
第一步:创建SSH Key
[qcr@ecs-205826 ~]$ ssh-keygen -t rsa -C "gitee 上配置的email"
Generating public/private rsa key pair.
Enter file in which to save the key (/home/qcr/.ssh/id_rsa):
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in /home/qcr/.ssh/id_rsa.
Your public key has been saved in /home/qcr/.ssh/id_rsa.pub.
The key fingerprint is:
SHA256:iJLEiBinPuJDFGYmtx8d8Gf4bWhZPasqC4CH2jLrpm4 2390139574@qq.com
The key's randomart image is:
+---[RSA 2048]----+
|o=o ... |
|BB.. o o . |
|=.+ . + o . o |
|o+ o o = = o |
|++= o . S o . |
|=o.o . . . |
|+o. . . |
| E. .. . |
|Oo .o. |
+----[SHA256]-----+
剩下的一路回车即可。
[qcr@ecs-205826 ~]$ ls .ssh
id_rsa id_rsa.pub known_hosts
- id_rsa:私钥,保存在自己的服务器上,不能对外展示。
- id_rsa.pub:公钥,将其配置在 gitee 服务器上。
这个时候输入对应的 gitee 密码进行验证之后,就成功的配置了一个 SSH 公钥了。而之前有所提到,在一个仓库下,可能会有多人协作的开发。如果用的都是 SSH 协议的方式,是需要配置多个电脑上的公钥,即在上述直接添加即可,其是支持我们进行多个 SSH 公钥的。
[qcr@ecs-205826 ~]$ git clone git@gitee.com:chuanru/remote---project.git
Cloning into 'remote---project'...
Warning: Permanently added the ECDSA host key for IP address '212.64.63.190' to the list of known hosts.
remote: Enumerating objects: 7, done.
remote: Counting objects: 100% (7/7), done.
remote: Compressing objects: 100% (7/7), done.
remote: Total 7 (delta 0), reused 0 (delta 0), pack-reused 0
Receiving objects: 100% (7/7), done.
向远程仓库推送
过程梳理
首先开发是在本地开发的,也就是对工作区先进行一定的修改。
然后将工作区中的修改通过 git add 命令放置暂存区中。
然后再通过 git commit 命令将暂存区中的内容提交至本地仓库上的 master 分支,一旦我们给 master 主分支上进行新的提交,对于本地仓库来说就有了一次新的修改,但是这个时候远程仓库是看不到我们本地修改的。远程仓库想要看到本地仓库的修改,是需要经过本地仓库的推送 git push 命令的。
也就是将本地仓库,比如说:本地仓库的 master 分支上的修改推送到远程仓库的 master 分支下,push 操作其实是分支与分支之间的交互。
实操
首先,进入一个仓库第一步就是配置,而如果看过前述博客就可以发现,之前配置的信息是 --global选项的,所以此处的 user.name 与 user.email 是已经有的,无需配置,此处不再提。
本地已经 git clone 成功远程仓库后,我们便可以向仓库中提交内容,例如:新增⼀个 file.txt 文件。
[qcr@ecs-205826 remote---project]$ git branch
* master
[qcr@ecs-205826 remote---project]$ vim file.txt
[qcr@ecs-205826 remote---project]$ git add .
[qcr@ecs-205826 remote---project]$ git commit -m "创建file.txt"
[master 1eff76c] 创建file.txt
1 file changed, 1 insertion(+)
create mode 100644 file.txt
[qcr@ecs-205826 remote---project]$ git status
# On branch master
# Your branch is ahead of 'origin/master' by 1 commit.
# (use "git push" to publish your local commits)
#
nothing to commit, working directory clean
由于这个仓库是克隆远程仓库的内容,所以此处比原来多了两行内容。
其建议我们进行 git push 命令,来将我们的本地提交进行一个推送的操作,推送到 'origin/master' 。该命令用于将本地的分支版本上传到远程并合并,命令格式如下:
git push <远程主机名> <本地分⽀名>:<远程分⽀名>
# 如果本地分⽀名与远程分⽀名相同,则可以省略冒号:
git push <远程主机名> <本地分⽀名>
[qcr@ecs-205826 remote---project]$ git push origin master:master
Counting objects: 4, done.
Delta compression using up to 2 threads.
Compressing objects: 100% (2/2), done.
Writing objects: 100% (3/3), 283 bytes | 0 bytes/s, done.
Total 3 (delta 1), reused 0 (delta 0)
remote: Powered by GITEE.COM [GNK-6.4]
To git@gitee.com:chuanru/remote---project.git
f5df974..1eff76c master -> master
这个时候,一旦推送成功,远端仓库就可以看到我们本地仓库的修改了。这个时候的当前仓库状态:
[qcr@ecs-205826 remote---project]$ git status
# On branch master
nothing to commit, working directory clean
这个时候的 gitee 中可以看到,该对应的远端仓库的 master 分支上:
#问:为什么可以push成功?
就是我们有一个 push 权限。
[qcr@ecs-205826 remote---project]$ git remote -v
origin git@gitee.com:chuanru/remote---project.git (fetch)
origin git@gitee.com:chuanru/remote---project.git (push)
所以进行推送成功的,是远程分支与本地分支之间的一些交互。所以我们必须要让两个分支成立链接关系,有这个关系才可以成功互通。
对于远程仓库和本地仓库的master分支来说,是在克隆的时候 Git 会自动帮我们建立联系。
拉取远程仓库
在 gitee 上点击 file.txt 文件并在线修改它:
此处采取新添加一行:
Note:此处只是由于本仓库只有一个用户,所以才在远端上直接修改,让远端仓库新于本地仓库,平时千万千万不能在远端仓库直接进行修改,要改就是在本地改,然后进行推送上来改。
git pull <远程主机名> <远程分⽀名>:<本地分⽀名>
# 如果远程分⽀是与当前分⽀合并,则冒号后⾯的部分可以省略。
git pull <远程主机名> <远程分⽀名>
[qcr@ecs-205826 remote---project]$ cat file.txt
hello Git
[qcr@ecs-205826 remote---project]$ git pull origin master:master
remote: Enumerating objects: 5, done.
remote: Counting objects: 100% (5/5), done.
remote: Compressing objects: 100% (2/2), done.
remote: Total 3 (delta 1), reused 0 (delta 0), pack-reused 0
Unpacking objects: 100% (3/3), done.
From gitee.com:chuanru/remote---project
1eff76c..0a6993b master -> master
[qcr@ecs-205826 remote---project]$ cat file.txt
hello Git
hello world
pull 其实是做了两件事情的:拉取 + 合并。
配置 Git
忽略特殊文件
在日常开发中,我们有些文件不想或者不应该提交到远端,比如:保存了数据库密码的配置文件。所以在这个时候,在 Git 工作区的根目录下会创建⼀个特殊的 .gitignore 文件,然后把要忽略的文件名填进去,Git 就会自动忽略这些文件了。
此处也就是之前,创建远程仓库时未讲解的第一个选项的部分。
# 省略选择模本的内容
...
# My configurations:
*.ini
*.so
[qcr@ecs-205826 remote---project]$ vim .gitignore
[qcr@ecs-205826 remote---project]$ cat .gitignore
*.ini
*.so
[qcr@ecs-205826 remote---project]$ git add .
[qcr@ecs-205826 remote---project]$ git status
# On branch master
# Your branch is ahead of 'origin/master' by 1 commit.
# (use "git push" to publish your local commits)
#
# Changes to be committed:
# (use "git reset HEAD <file>..." to unstage)
#
# new file: .gitignore
#
[qcr@ecs-205826 remote---project]$ git commit -m "创建.gitignore"
[master e532e80] 创建.gitignore
1 file changed, 2 insertions(+)
create mode 100644 .gitignore
[qcr@ecs-205826 remote---project]$ git push origin master
Counting objects: 4, done.
Delta compression using up to 2 threads.
Compressing objects: 100% (2/2), done.
Writing objects: 100% (3/3), 284 bytes | 0 bytes/s, done.
Total 3 (delta 1), reused 0 (delta 0)
remote: Powered by GITEE.COM [GNK-6.4]
To git@gitee.com:chuanru/remote---project.git
0a6993b..e532e80 master -> master
这个时候让我们创建一个 .so 文件进行测试。
[qcr@ecs-205826 remote---project]$ touch a.so
[qcr@ecs-205826 remote---project]$ ls
a.so file.txt README.en.md README.md
[qcr@ecs-205826 remote---project]$ git status
# On branch master
nothing to commit, working directory clean
这个时候,但道理来所明明应该会有工作区的变化,但是状态查询下工作区是干净的。这就是因为我们在 .gitignore 下的配置就是,不让 Git 对所有的 .so 文件进行追踪管理。但有些时候,我们就是想添加⼀个文件到 Git,但由于这个文件被 .gitignore 忽略了,根本添加不了,那么可以用 -f 强制添加。
[qcr@ecs-205826 remote---project]$ git add -f .
[qcr@ecs-205826 remote---project]$ git status
# On branch master
# Changes to be committed:
# (use "git reset HEAD <file>..." to unstage)
#
# new file: a.so
#
但是尽量还是不要破坏 .gitignore 文件的规则的,最好的方式就是在 .gitignore 文件添加配置。(文件名前面加 ! ,表示不排除)
[qcr@ecs-205826 remote---project]$ vim .gitignore
[qcr@ecs-205826 remote---project]$ cat .gitignore
*.ini
*.so
!a.so
[qcr@ecs-205826 remote---project]$ touch b.so
[qcr@ecs-205826 remote---project]$ git check-ignore -v b.so
.gitignore:2:*.so b.so
给命令配置别名
在我们使用 Git 期间,有些命令敲的时候着实让人头疼(太长了……),幸运的是 Git 支持对命令进行简化!
[qcr@ecs-205826 remote---project]$ git config --global alias.st status
[qcr@ecs-205826 remote---project]$ git st
# On branch master
nothing to commit, working directory clean
--global 参数是全局参数,也就是这些命令在这台电脑的所有 Git 仓库下都有用。如果不加,那只针对当前的仓库起作用。 该取别名,甚至可以是更长的:
[qcr@ecs-205826 remote---project]$ git log --pretty=oneline --abbrev-commit
e532e80 创建.gitignore
0a6993b update file.txt.
1eff76c 创建file.txt
f5df974 Initial commit
[qcr@ecs-205826 remote---project]$ git config --global alias.lpa "log --pretty=oneline --abbrev-commit"
[qcr@ecs-205826 remote---project]$ git lpa
e532e80 创建.gitignore
0a6993b update file.txt.
1eff76c 创建file.txt
f5df974 Initial commit