文章目录
- [Ⅰ. 理解分布式版本控制系统](#Ⅰ. 理解分布式版本控制系统)
- [Ⅱ. 远程仓库](#Ⅱ. 远程仓库)
-
- 一、新增远程仓库
- [二、克隆远程仓库 -- `git clone` && `git remote -v`](#二、克隆远程仓库 --
git clone
&&git remote -v
) -
- [① 使用https方式连接](#① 使用https方式连接)
- [💥题外话 -- SSH 密钥登录](#💥题外话 -- SSH 密钥登录)
-
- [1. 密钥是什么](#1. 密钥是什么)
- [2. 密钥登录的过程](#2. 密钥登录的过程)
- [② 使用 SSH 方式](#② 使用 SSH 方式)
- [三、向远程仓库推送 -- `git push`](#三、向远程仓库推送 --
git push
) - [四、拉取远程仓库 -- `git pull` && `git fetch`](#四、拉取远程仓库 --
git pull
&&git fetch
)
- [Ⅲ. 配置Git](#Ⅲ. 配置Git)
-
- [一、忽略特殊文件 `.gitignore`](#一、忽略特殊文件
.gitignore
) - 二、给命名配置起别名
- [一、忽略特殊文件 `.gitignore`](#一、忽略特殊文件

Ⅰ. 理解分布式版本控制系统
我们目前所说的所有内容(工作区,暂存区,版本库等等),都是在本地!也就是在你的笔记本或者计算机上。而我们的 Git 其实是分布式版本控制系统!什么意思呢❓❓❓
可以简单理解为,我们每个人的电脑上都是一个完整的版本库,这样你工作的时候,就不需要联网了,因为版本库就在你自己的电脑上。既然每个人电脑上都有一个完整的版本库,那多个人如何协作呢?比如说你在自己电脑上改了文件 A
,你的同事也在他的电脑上改了文件 A
,这时,你们俩之间只需把各自的修改推送给对方,就可以互相看到对方的修改了!
分布式版本控制系统的安全性要高很多,因为每个人电脑里都有完整的版本库,某一个人的电脑坏掉了不要紧,随便从其他人那里复制一份就可以了。
在实际使用分布式版本控制系统的时候,其实很少在两人之间的电脑上推送版本库的修改,因为可能你们俩不在⼀局域网内,两台电脑就互相访问不了。也可能今天你的同事病了,他的电脑压根没有开机。因此,分布式版本控制系统通常也有一台充当"中央服务器"的电脑 ,但这个服务器的作用仅仅是用来方便 "交换" 大家的修改,没有它大家也一样干活,只是交换修改不方便而已。有了这个 "中央服务器" 的电脑,这样就不怕本地出现什么故障了!(比如运气差,硬盘坏了,上面的所有东西全部丢失,包括 git
的所有内容)

Ⅱ. 远程仓库
Git
是分布式版本控制系统,同一个 Git
仓库,可以分布到不同的机器上。怎么分布呢?最早,肯定只有一台机器有一个原始版本库,此后,别的机器可以 "克隆" 这个原始版本库,而且每台机器的版本库其实都是一样的,并没有主次之分。
你肯定会想,至少需要两台机器才能玩远程库不是?但是我只有一台电脑,怎么玩?
其实 一台电脑上也是可以克隆多个版本库的,只要不在同一个目录下。不过,现实生活中是不会有人这么傻的在一台电脑上搞几个远程库玩,因为一台电脑上搞几个远程库完全没有意义,而且硬盘挂了会导致所有库都挂掉,所以我也不告诉你在一台电脑上怎么克隆多个仓库。实际情况往往是这样,找一台电脑充当服务器的角色,每天24小时开机,其他每个人都从这个 "服务器" 仓库克隆一份到自己的电脑上,并且各自把各自的提交推送到服务器仓库里,也从服务器仓库中拉取别人的提交。
完全可以自己搭建一台允许 Git
的服务器,不过现阶段,为了学 Git
先搭个服务器绝对是小题大做。好在这个世界上有个叫 GitHub
的神奇的网站,从名字就可以看出,这个网址就是提供 Git
仓库托管服务的,所以,只要注册一个 GitHub
账号,就可以免费获得 Git
远程仓库。
github 是国外的网站,速度比较慢,我们统⼀采用 码云 来托管代码。

我们在本地可以通过 git branch -r
指令来查看当前本地分支对应的远程仓库中有哪些分支:
shell
[liren@VM-8-7-centos remote-test]$ git branch -r
origin/HEAD -> origin/master
origin/master
一、新增远程仓库
这一步我们只需要在平台上操作即可,相对来说比较简单,这里只介绍一些选项帮助理解:

- Issue
Issue
是指问题、Bug
或需求等。在Gitee
中,可以使用Issue
来跟踪和管理项目中的问题或需求,以便团队成员能够更好地协作和解决问题。通过Issue
,用户可以提交对项目的问题或建议,也可以评论、修改、关闭或重新打开已有的Issue
。
- Pull Request
Pull Request
是指 代码合并请求 。在Gitee
中,如果用户想贡献代码到某个项目,可以使用Pull Request
来向项目管理者提交代码。提交Pull Request
之后,项目管理者可以查看代码、评论代码、讨论问题,并最终决定是否接受这个Pull Request
。如果接受了Pull Request
,这个代码将被合并到项目中。
二、克隆远程仓库 -- git clone
&& git remote -v
克隆/下载远端仓库到本地,需要使用 git clone
命令,后面跟上我们的远端仓库的链接,远端仓库的链接可以从仓库中找到:选择 "克隆/下载" 获取远程仓库链接:

SSH
协议和 HTTPS
协议是 Git
最常使用的两种数据传输协议。SSH
协议使用了公钥加密和公钥登陆机制,体现了其实用性和安全性 ,使用此协议需要将我们的公钥放上服务器,由 Git 服务器进行管理。使用 HTTPS
方式时,没有要求,可以直接克隆下来。
还有一个要注意的是,克隆的远程仓库,不能和本地的仓库在同一个目录,也就是 不能在已有 .git
的目录下克隆远程仓库!
并且 默认情况下,远程仓库的名字都设为 origin
,这个名称可以在后续的操作中使用!
① 使用https方式连接
在下面操作中会用到 git remote
指令,它可以 查看当前代码库中已有的远程代码库,也可以添加、重命名、删除远程代码库等。
具体的用法如下:
- 查看当前代码库中已有的远程代码库,其中加上
-v
选项可以看的更详细:git remote -v
- 添加远程代码库:
git remote add <name> <url>
- 删除远程代码库:
git remote remove <name>
- 重命名远程代码库:
git remote rename <old-name> <new-name>
除了上述常用的命令外,git remote
还有其他的一些选项和参数,可以通过 git remote --help
命令查看帮助文档。值得注意的是,git remote
命令只是管理与远程代码库的连接,它 并不会传输代码或数据 ,传输代码或数据需要使用其他的命令,比如 git push
和 git pull
等。
shell
[liren@VM-8-7-centos ~]$ ls
gitcode
[liren@VM-8-7-centos ~]$ git clone https://gitee.com/lirendada/remote-code.git #在没有本地仓库的目录下克隆远程仓库
Cloning into 'c-code'...
remote: Enumerating objects: 587, done.
remote: Counting objects: 100% (587/587), done.
remote: Compressing objects: 100% (297/297), done.
remote: Total 587 (delta 197), reused 529 (delta 192), pack-reused 0
Receiving objects: 100% (587/587), 46.43 MiB | 11.13 MiB/s, done.
Resolving deltas: 100% (197/197), done.
Checking out files: 100% (409/409), done.
[liren@VM-8-7-centos ~]$ ll
total 28
drwxrwxr-x 6 liren liren 4096 Jul 13 12:14 remote-code
drwxrwxr-x 3 liren liren 4096 Jul 12 17:00 gitcode
[liren@VM-8-7-centos ~]$ cd c-code/
[liren@VM-8-7-centos c-code]$ ls
README.en.md README.md
[liren@VM-8-7-centos c-code]$ git remote -v # 查看该远程仓库origin允许我们当前使用的功能,fetch表示获取,push是推送
origin https://gitee.com/lirendada/remote-code.git (fetch)
origin https://gitee.com/lirendada/remote-code.git (push)
💥题外话 -- SSH 密钥登录
为什么要先讲这个呢,因为下面我们要使用 SSH
登录,我们起码要搞懂它的原理!
SSH
默认采用密码登录,这种方法有很多缺点,简单的密码不安全,复杂的密码不容易记忆,每次手动输入也很麻烦。密钥登录是比密码登录更好的解决方案。
1. 密钥是什么
密钥(key
)是一个非常大的数字,通过加密算法得到。对称加密只需要一个密钥,非对称加密需要两个密钥成对使用,分为 公钥 (public key
)和 私钥 (private key
)。
SSH
密钥登录采用的是非对称加密 ,每个用户通过自己的密钥登录!其中,私钥必须私密保存 ,不能泄漏;公钥则是公开的,可以对外发送。它们的关系是,公钥和私钥是一一对应的,每一个私钥都有且仅有一个对应的公钥,反之亦然。
如果数据使用公钥加密,那么只有使用对应的私钥才能解密,其他密钥都不行;反过来,如果使用私钥加密(这个过程一般称为"签名"),也只有使用对应的公钥解密。
2. 密钥登录的过程
预备步骤,客户端通过 ssh-keygen
指令生成自己的公钥和私钥。
第一步:手动将客户端的公钥放入远程服务器的指定位置。
第二步:客户端向服务器发起 SSH
登录的请求。
第三步:服务器收到用户 SSH
登录的请求,发送一些随机数据给用户,要求用户证明自己的身份。
第四步:客户端收到服务器发来的数据,使用私钥对数据进行签名,然后再发还给服务器。
第五步:服务器收到客户端发来的加密签名后,使用对应的公钥解密,然后跟原始数据比较。如果一致,就允许用户登录。
② 使用 SSH 方式
首先,如果我们直接复制远程仓库的 SSH
链接后使用 git clone
的话,那么会出现以下错误:
shell
[liren@VM-8-7-centos ~]$ ls
gitcode
[liren@VM-8-7-centos ~]$ git clone git@gitee.com:lirendada/remote-code.git # 直接克隆,发现报错
Cloning into 'remote-code'...
The authenticity of host 'gitee.com (182.255.33.134)' can't be established.
ECDSA key fingerprint is SHA256:FQGC9Kn/eye1W8icdBgrQp+KkGYoFgbVr17bmjey0Wc.
ECDSA key fingerprint is MD5:27:e5:d3:f7:2a:9e:eb:6c:93:cd:1f:c1:47:a3:54:b1.
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added 'gitee.com,182.255.33.134' (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.
[liren@VM-8-7-centos ~]$
这是因为我们 没有添加公钥到远端库中 ,服务器拒绝了我们的 clone
链接。需要我们做一些处理:
第一步:创建 SSH Key
。在 用户主目录 下,看看有没有 .ssh
目录,如果有,再看看这个目录下有没有 id_rsa
(私钥) 和 id_rsa.pub
(公钥) 这两个文件,如果已经有了,可直接跳到第二步。如果没有,则需要往下看,创建 SSH Key
!
shell
[liren@VM-8-7-centos ~]$ cd ~/.ssh
[liren@VM-8-7-centos .ssh]$ ls
known_hosts
接下来我们 要把客户端的公钥放在 gitee
上,我们回到客户端,创建一个公钥。
如果是
windows
系统公钥私钥的目录在C:\Users\用户名\.ssh
下如果是
mac
或者linux
, 则公钥私钥的目录在~/.ssh/
中, 如果发现自己的电脑上没有公钥私钥,那就自己创建一个
创建密钥的命令如下:
shell
ssh-keygen -t rsa -C "邮箱地址" #注意gitee等平台需要有邮箱地址绑定,如果是git私服则不需要
操作只需要一路回车即可,不需要填任何东西,如下所示:
shell
[liren@VM-8-7-centos .ssh]$ ssh-keygen -t rsa -C "2916776007@qq.com"
Generating public/private rsa key pair.
Enter file in which to save the key (/home/liren/.ssh/id_rsa):
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in /home/liren/.ssh/id_rsa.
Your public key has been saved in /home/liren/.ssh/id_rsa.pub.
The key fingerprint is:
SHA256:iE5XxDWs54ABaW6vqj2CnoJ/UAzXnZVAdEqNQ4+n0MI 2916776007@qq.com
The key's randomart image is:
+---[RSA 2048]----+
| .+ *BO=. |
| . +.o+*=+. |
| * Eo=oo |
| =..=oo. |
| oo.o S+ |
| .o .. . |
|o ... |
|=.o o |
|+*++ |
+----[SHA256]-----+
[liren@VM-8-7-centos .ssh]$
超过的话,我们就可以在 .ssh
目录下看到 id_rsa
和 id_rsa.pub
两个文件了,注意 id_rsa
是私钥,不能泄露出去,而 id_rsa.pub
是公钥,可以放心地告诉任何人。
shell
[liren@VM-8-7-centos .ssh]$ ll
total 12
-rw------- 1 liren liren 1679 Jul 13 14:32 id_rsa #私钥,不能泄露
-rw-r--r-- 1 liren liren 399 Jul 13 14:32 id_rsa.pub #公钥
-rw-r--r-- 1 liren liren 186 Jul 13 14:03 known_hosts
第二步:添加自己的公钥到远端仓库。

点击确认后,需要对你进行认证,输入你的账号密码即可。至此,我们的准备工作全部做完,欢快的 clone
吧!
shell
[liren@VM-8-7-centos ~]$ git clone git@gitee.com:lirendada/remote-code.git
Cloning into 'remote-code'...
remote: Enumerating objects: 637, done.
remote: Counting objects: 100% (637/637), done.
remote: Compressing objects: 100% (605/605), done.
remote: Total 637 (delta 262), reused 0 (delta 0), pack-reused 0
Receiving objects: 100% (637/637), 4.42 MiB | 881.00 KiB/s, done.
Resolving deltas: 100% (262/262), done.
[liren@VM-8-7-centos ~]$
[liren@VM-8-7-centos ~]$ ls
remote-code gitcode
成功!如果有多个人协作开发,GitHub
/Gitee
允许添加多个公钥,只要把每个人的电脑上的 Key
都添加到 GitHub
/Gitee
,就可以在每台电脑上往 GitHub
/Gitee
上提交推送了。
三、向远程仓库推送 -- git push
本地已经 clone
成功远程仓库后,我们便可以向仓库中提交内容!
下面新增一个 file.txt
文件并且提交:
shell
[liren@VM-8-7-centos remote-test]$ ls
README.en.md README.md
[liren@VM-8-7-centos remote-test]$ touch file.txt
[liren@VM-8-7-centos remote-test]$ echo "hello git" >> file.txt
[liren@VM-8-7-centos remote-test]$ cat file.txt
hello git
[liren@VM-8-7-centos remote-test]$ git add .
[liren@VM-8-7-centos remote-test]$ git commit -m 'add file.txt'
[master 221511a] add file.txt
1 file changed, 1 insertion(+)
create mode 100644 file.txt
提交时要注意,如果我们之前设置过全局的 name
和 e-mail
,这两项配置需要和 gitee
上配置的用户名和邮箱一致,否则会出错 。或者从来没有设置过全局的 name
和 e-mail
,那么我们第一次提交时也会报错。这就需要我们重新配置下了,同样要注意需要和 gitee
上配置的用户名和邮箱一致。如何配置已讲过,在这里就不再赘述。
到这里我们已经将内容提交至本地仓库中,如何将本地仓库的内容推送至远程仓库呢,需要使用 git push
命令,该命令用于将本地的分支版本上传到远程并合并,命令格式如下:
shell
git push <远程主机名> <本地分支名>:<远程分支名>
# 如果本地分支名与远程分支名相同,则可以省略冒号:
git push <远程主机名> <本地分支名>
可以看出,推送的本质就是 本地的分支
和 远端的分支
的交互!
此时我们要将本地的 master
分支推送到 origin
主机的 master
分支,则可以:
shell
[liren@VM-8-7-centos remote-test]$ 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), 270 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:lirendada/remote-test.git
e7f4971..221511a master -> master
[liren@VM-8-7-centos remote-test]$
推送成功!这里由于我们使用的是 SSH
协议,不用每一次推送都输入密码的,方便了我们的推送操作。如果你使用的是 HTTPS
协议,有个麻烦地方就是每次推送都必须输入口令。
接下来,看看码云远端:

代码已经被推送至远端了:

四、拉取远程仓库 -- git pull
&& git fetch
一般在远程仓库中更新了新的代码之后,我们就要将其拉取过来合并到本地仓库中!
在 gitee
上点击之前的 file.txt
文件并在线修改它:(这里只是为了简单而这样子演示,一般我们规定不允许直接在线修改的,而是必须在本地修改完再上传到远程仓库中去)

此时,远程仓库是要领先于本地仓库一个版本,为了使本地仓库保持最新的版本,我们需要拉取下远端代码,并合并到本地。Git
提供了 git pull
命令,该命令 用于从远程获取代码并合并本地的版本。格式如下:
shell
git pull <远程主机名> <远程分支名>:<本地分支名>
# 如果远程分支是与当前分支合并,则冒号后面的部分可以省略。
git pull <远程主机名> <远程分支名>
下面我们就在本地仓库将更改内容拉取过来:
shell
[liren@VM-8-7-centos remote-test]$ cat file.txt # 原来的内容
hello git
[liren@VM-8-7-centos remote-test]$ git pull
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:lirendada/remote-test
221511a..f167d57 master -> origin/master
Updating 221511a..f167d57
Fast-forward
file.txt | 1 +
1 file changed, 1 insertion(+)
[liren@VM-8-7-centos remote-test]$ cat file.txt # 更新内容后
hello git
add new line;
其实除了 git pull
之外,还有一个 git fetch
指令也是用于拉取远端仓库的,但是它们有一些不同之处:
git fetch
只是从远程仓库下载最新的代码,但不会自动合并到本地代码中 。这意味着你需要手动执行git merge
命令来合并远程仓库的代码更新到本地仓库中。这个过程可以让你更加精细地控制代码更新的合并过程。git pull
命令的作用是从远程仓库下载最新的代码,并自动将其合并到当前分支中 。它包含了git fetch
和git merge
两个步骤,因此更加方便。但是,由于自动合并可能会导致冲突,所以你需要确保在执行git pull
命令之前,你的本地代码不会和远程代码产生冲突。
因此,当你想要获取远程仓库中的最新代码时,如果你想要更加精细地控制代码更新的合并过程,可以使用 git fetch
命令。如果你希望更加方便地获取远程仓库中的代码更新,并将其自动合并到本地分支中,可以使用 git pull
命令。
Ⅲ. 配置Git
一、忽略特殊文件 .gitignore
在日常开发中,我们有些文件不想或者不应该提交到远端,比如保存了数据库密码的配置文件,那怎么让 Git
知道呢?在 Git
工作区的根目录下 创建一个特殊的 .gitignore
文件,然后把要忽略的文件名填进去,Git
就会自动忽略这些文件了。
我们不需要从头写 .gitignore
文件,gitee
在创建仓库时就可以为我们生成,不过需要我们主动勾选一下:

如果当时没有选择这个选择,在工作区创建一个也可以。无论哪种方式,最终都可以得到以个完整的 .gitignore
文件,例如我们想忽略以 .so
和 .ini
结尾所有文件,.gitignore
的内容如下:
shell
[liren@VM-8-7-centos remote-test]$ touch .gitignore
[liren@VM-8-7-centos remote-test]$ vim .gitignore
[liren@VM-8-7-centos remote-test]$ cat .gitignore
*.ini
*.so
在 .gitignore
文件中也可以指定某个确定的文件。最后一步就是**把 .gitignore
也提交到远端**,就完成了!
但有些时候,你就是想添加一个文件到 Git
,但由于这个文件被 .gitignore
忽略了,根本添加不了,那么 可以用 -f
强制添加:
shell
git add -f [filename]
或者你发现,可能是 .gitignore
写得有问题,需要找出来到底哪个规则写错了,比如说 a.so
文件是要被添加的,那么可以用 git check-ignore -v
命令检查,其检查一个或多个文件是否被 Git
的忽略规则所忽略!其中 -v
选项表示显示详细信息!
例如,如果你想要检查 foo.txt
文件是否被 Git
忽略规则所忽略,可以使用以下命令:
shell
git check-ignore -v foo.txt
还有些时候,当我们编写了规则排除了部分文件时,例如:
shell
# 排除所有.开头的隐藏⽂件:
.*
但是我们发现 .*
这个规则把 .gitignore
也排除了。虽然可以用 git add -f
强制添加进去,但有强迫症的童鞋还是希望不要破坏 .gitignore
规则,这个时候,可以添加一条例外规则:
shell
# 排除所有.开头的隐藏⽂件:
.*
# 取反表示不排除.gitignore
!.gitignore
二、给命名配置起别名
在我们使用 Git
期间,有些命令敲的时候着实让人头疼(太长了。。),幸运的是,git
支持对命令进行简化!
举个例子,将 git status
简化为 git st
,对应的命令为:
shell
git config --global alias.st status
--global
参数是全局参数,也就是这些命令在这台电脑的所有 Git
仓库下都有用。如果不加,那只针对当前的仓库起作用。
