【Git】三、远程管理

文章目录

  • [Ⅰ. 理解分布式版本控制系统](#Ⅰ. 理解分布式版本控制系统)
  • [Ⅱ. 远程仓库](#Ⅱ. 远程仓库)
    • 一、新增远程仓库
    • [二、克隆远程仓库 -- `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)

Ⅰ. 理解分布式版本控制系统

​ 我们目前所说的所有内容(工作区,暂存区,版本库等等),都是在本地!也就是在你的笔记本或者计算机上。而我们的 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

一、新增远程仓库

​ 这一步我们只需要在平台上操作即可,相对来说比较简单,这里只介绍一些选项帮助理解:

  1. Issue
    • Issue 是指问题、Bug 或需求等。在 Gitee 中,可以使用 Issue 来跟踪和管理项目中的问题或需求,以便团队成员能够更好地协作和解决问题。通过Issue,用户可以提交对项目的问题或建议,也可以评论、修改、关闭或重新打开已有的 Issue
  2. 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 pushgit 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_rsaid_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

​ 提交时要注意,如果我们之前设置过全局的 namee-mail,这两项配置需要和 gitee 上配置的用户名和邮箱一致,否则会出错 。或者从来没有设置过全局的 namee-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 fetchgit 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 仓库下都有用。如果不加,那只针对当前的仓库起作用。

相关推荐
fruge4 小时前
git上传 项目 把node_modules也上传至仓库了,在文件.gitignore 中忽略node_modules 依然不行
大数据·git·elasticsearch
_OMG_5 小时前
Git 高效同步远程分支与本地分支清理技巧
git
心无旁骛~6 小时前
Git笔记汇总,持续更新~
笔记·git
{⌐■_■}14 小时前
【git】工作场景下的 工作区 <-> 暂存区<-> 本地仓库 命令实战 具体案例
大数据·git·elasticsearch·golang·iphone·ip·etcd
李狗蛋儿啊16 小时前
zero自动化框架搭建---Git安装详解
运维·git·自动化
人工干智能18 小时前
科普:“git“与“github“
git·github
{⌐■_■}1 天前
【git】提交修改、回撤、回滚、Tag 操作讲解,与reset (--soft、--mixed、--hard) 的区别
大数据·git·elasticsearch
GardenTu1 天前
初尝git自结命令大全与需要理解的地方记录
git·github
真就死难2 天前
Git是什么
git
机械心2 天前
代码管理git详细使用教程及最佳实践路径
git