[Git] 分布式版本控制 & 远程仓库协作

文章目录

好前面我们学习了 Git 的核心概念和本地操作:工作区、暂存区、版本库,以及提交、回退、分支管理。所有这些操作,都是在你自己的电脑上完成的。但是 Git 最重要的特点之一,在于它是 分布式版本控制系统 。这一章,我们来理解分布式以及如何与远程仓库协作。

理解分布式版本控制系统

我们之前所有的操作,比如 git init 创建仓库,git add, git commit, git branch, git checkout, git merge 等等,都是针对本地版本库进行的。这个本地版本库就在你自己的电脑硬盘上,包含了完整的项目历史记录。

什么是分布式?

分布式版本控制系统(Distributed VCS)最核心的特点是:每个参与开发的人电脑上,都有一个项目的完整版本库。不仅仅是最新代码,而是从项目诞生以来的所有历史记录、分支信息等等,都在每个人的本地。

这与传统的集中式版本控制系统(如 SVN)有很大不同。在集中式系统中,只有一个中央服务器拥有完整的版本库,你本地电脑上通常只保存当前工作所需的文件,你提交、更新、查看历史等所有操作都需要连接到中央服务器。服务器挂了或者网络断了,你就没法工作了。

分布式的优势:

  1. 离线工作: 因为你本地有完整的版本库,大部分操作(提交、查看历史、创建分支、合并分支等)都可以在没有网络的情况下进行。
  2. 高性能: 大部分操作都在本地完成,速度非常快。
  3. 数据安全: 版本库分布在多个开发者电脑上,即使某个电脑硬盘损坏,也可以轻松地从其他人的电脑上复制一个完整的版本库来恢复,数据的安全性大大提高。
  4. 灵活协作: 理论上,开发者之间可以直接通过网络互相推送和拉取修改,不需要固定的中央服务器。

分布式如何协作?

既然每个人都有完整的版本库,大家怎么同步彼此的修改呢?理论上,Git 允许任何两个版本库之间进行推送(push)和拉取(pull)修改。比如你修改了文件 A 并提交了,你的同事修改了文件 B 并提交了,你们只需要互相把各自的修改推送给对方的版本库,你们的本地版本库就会包含彼此的修改了。

在实际应用中,虽然理论上可以点对点推送,但通常为了方便管理和交换彼此的修改,大家会找一台"服务器"来充当一个集中的"中转站"。这台服务器上的版本库并没有什么特别之处,它也只是一个普通的 Git 版本库,但大家约定俗成地都向它推送自己的修改,也从它那里拉取别人的修改。这样,所有人的修改都通过这个"中转站"进行交换,协作就变得方便有序了。即使没有这个服务器,大家也能工作(只是交换修改不方便),所以它不是必需的,只是为了方便协作而存在的。

远程仓库

远程仓库(Remote Repository)就是存放在另一台计算机上的 Git 版本库。这个"另一台计算机"可能是你本地局域网的一台服务器,但更多时候,它指的是托管在互联网上的 Git 服务提供商的服务器,比如 GitHub、Gitee(码云)、GitLab、Bitbucket 等。这些平台提供了免费或付费的 Git 仓库托管服务。

克隆远程仓库: git clone

要开始和远程仓库协作,最常见的第一步就是从远程仓库**克隆(Clone)**一份完整的版本库到你自己的本地电脑上。

命令: git clone <远程仓库的 URL>

这个命令会完成几件事:

  1. 在当前目录下创建一个新的文件夹(通常以远程仓库的名称命名)。
  2. 在这个文件夹里初始化一个本地 Git 仓库 (git init)。
  3. 从远程仓库下载所有的数据(包括所有提交、分支等)。
  4. 根据下载的数据在本地重建完整的项目历史。
  5. 自动设置 这个远程仓库为你的本地仓库的"远程主机",并将其命名为 origin(这是默认的远程主机名)。
  6. 自动创建并切换到本地 master(或 main)分支,并将其配置为跟踪远程仓库的 master(或 main)分支。

获取远程仓库链接:

你可以在 Git 仓库托管平台的网页界面找到仓库的克隆链接。通常会提供多种协议的链接,最常用的是 HTTPS 和 SSH。

在仓库页面,找到"克隆/下载"按钮,点击后会看到 HTTPS 和 SSH 两种链接。

HTTPS 和 SSH 协议的区别:

  • HTTPS:
    • 优点: 设置简单,不需要额外配置。直接复制链接就可以克隆。
    • 缺点: 每次进行需要验证的操作(如 git push 推送代码)时,通常都需要输入你的用户名和密码。如果你的仓库设置了双重认证,可能还需要输入 Token。
  • SSH:
    • 优点: 安全性更高,并且一旦设置好,在进行需要验证的操作时无需重复输入密码,非常方便自动化操作和频繁推送。
    • 缺点: 第一次使用需要在你的电脑上生成 SSH Key(一对公钥和私钥),并将你的公钥添加到 Git 服务器(如 Gitee、GitHub)的账户设置中。

使用 HTTPS 方式克隆:

直接复制 HTTPS 链接,然后执行 git clone 命令。

bash 复制代码
# 切换到你想存放项目的目录,比如用户主目录
zz@139-159-150-152:~$ cd ~

# 使用 HTTPS 链接克隆远程仓库
zz@139-159-150-152:~$ git clone https://gitee.com/zz91/git_teaching.git
Cloning into 'git_teaching'... # 正在克隆到 git_teaching 文件夹
Username for 'https://gitee.com': zz91 # 可能会让你输入用户名和密码
Password for 'https://[email protected]':
remote: Enumerating objects: 4, done. # 下载对象...
...
Unpacking objects: 100% (4/4), 1.80 KiB | 1.80 MiB/s, done. # 解压对象,完成

# 查看当前目录,多了一个克隆下来的文件夹
zz@139-159-150-152:~$ ls
gitcode git_teaching

# 进入克隆下来的仓库目录
zz@139-159-150-152:~$ cd git_teaching/

# 查看里面的文件,就是远程仓库的文件
zz@139-159-150-152:~/git_teaching$ ls
README.en.md README.md

成功使用 HTTPS 克隆了远程仓库!

使用 SSH 方式克隆:

SSH 方式需要先配置 SSH Key。

第一步:检查或创建 SSH Key

在你的用户主目录(Linux/macOS 是 ~,Windows 是 C:\Users\你的用户名)下,查找是否有 .ssh 隐藏目录。进入该目录,看是否有 id_rsa (私钥) 和 id_rsa.pub (公钥) 这两个文件。

bash 复制代码
# 检查 .ssh 目录是否存在及内容
zz@139-159-150-152:~$ ls -a ~/.ssh/

如果已经有了 id_rsaid_rsa.pub,可以直接跳到第二步。

如果没有,需要生成 SSH Key:

bash 复制代码
# 执行生成 SSH Key 命令
# -t rsa 表示使用 RSA 加密算法
# -C "你的邮箱" 加上你的邮箱作为备注,方便识别
zz@139-159-150-152:~$ ssh-keygen -t rsa -C "[email protected]"
Generating public/private rsa key pair.
Enter file in which to save the key (/home/zz/.ssh/id_rsa): # 直接回车,使用默认路径
Enter passphrase (empty for no passphrase): # 这里是设置 SSH Key 的密码,可以直接回车跳过(无密码)
Enter same passphrase again: # 再次回车确认
Your identification has been saved in /home/zz/.ssh/id_rsa # 私钥文件路径
Your public key has been saved in /home/zz/.ssh/id_rsa.pub # 公钥文件路径
The key fingerprint is: ... # 显示 Key 指纹
The key's randomart image is: ... # 显示 Key 随机艺术图

执行完命令后,你的用户主目录下的 .ssh 目录里就会生成 id_rsa(你的私钥 ,务必保管好,不要泄露给任何人)和 id_rsa.pub(你的公钥,可以放心地添加到任何 Git 服务器上)。

第二步:将公钥添加到远程仓库托管平台(以 Gitee 为例)

登录你的 Gitee 账号,找到设置页面,通常在"设置"->"SSH公钥"或类似位置。

在 SSH 公钥设置页面:

  1. 给你的公钥取一个"标题"(比如"我的笔记本电脑")。
  2. 将你在第一步生成的 id_rsa.pub 文件中的全部内容 复制粘贴到"公钥"文本框里。id_rsa.pub 文件可以用文本编辑器打开查看内容。
  3. 点击"确定"或"添加"。平台可能会要求你再次输入账号密码进行确认。

完成后,Git 服务器就认识你的电脑了。

使用 SSH 方式克隆(成功):

现在,使用 SSH 链接再次尝试克隆:

bash 复制代码
# 切换到你想存放项目的目录
zz@139-159-150-152:~$ cd ~

# 使用 SSH 链接克隆远程仓库
zz@139-159-150-152:~$ git clone [email protected]:zz91/git_teaching.git
Cloning into 'git_teaching'...
# 第一次连接该服务器时,可能会出现主机信任提示,输入 yes 回车即可
The authenticity of host 'gitee.com (212.64.63.215)' can't be established.
...
Are you sure you want to continue connecting (yes/no/[fingerprint])? yes
Warning: Permanently added 'gitee.com,...' to the list of known hosts.

# 如果 SSH Key 设置正确,不会再要求输入密码,直接开始克隆
remote: Enumerating objects: 4, done.
...
Receiving objects: 100% (4/4), done.

# 查看并进入目录
zz@139-159-150-152:~$ ls
gitcode git_teaching
zz@139-159-150-152:~$ ls git_teaching/
README.en.md README.md

成功使用 SSH 克隆了远程仓库,并且因为配置了 SSH Key,克隆时没有要求输入密码。今后使用 SSH 进行推送和拉取时也无需输入密码。

克隆后的配置: origin** 和 **git remote

当你使用 git clone 命令时,Git 会自动将 远程仓库的 URL 添加到本地仓库的配置中,并将其命名为 originorigin 是克隆时创建的远程主机的默认名称。

你可以使用 git remote 命令查看本地仓库关联了哪些远程主机:

bash 复制代码
# 在克隆下来的仓库目录中执行
zz@139-159-150-152:~/git_teaching$ git remote
origin # 显示有一个名为 origin 的远程主机

使用 git remote -v 可以查看更详细的信息,包括抓取(fetch)和推送(push)的 URL:

bash 复制代码
zz@139-159-150-152:~/git_teaching$ git remote -v
origin [email protected]:zz91/git_teaching.git (fetch) # origin 的抓取地址
origin [email protected]:zz91/git_teaching.git (push)   # origin 的推送地址

这里的地址就是你克隆时使用的 SSH URL。如果是 HTTPS 克隆,这里会显示 HTTPS URL。拥有 push 地址意味着你有推送到这个远程仓库的权限。

推送本地修改到远程仓库:git push

在本地仓库进行开发,addcommit 提交了一系列修改后,这些修改只存在于你的本地版本库中。要让这些修改同步到远程仓库,以便与他人协作或作为备份,你需要使用 git push 命令。

命令: git push <远程主机名> <本地分⽀名>:<远程分⽀名>

这个命令的意义是:"Git,请把我本地<本地分支名> 分支上的最新提交,推送到 <远程主机名> 这个远程仓库的 <远程分支名> 分支上。"

如果本地分支名和远程分支名相同(这是最常见的情况,比如推送到远程的 master 分支),可以省略冒号和远程分支名:

git push <远程主机名> <本地分⽀名>

操作演示:

在克隆下来的 git_teaching 本地仓库中,我们新建一个文件 file.txt 并提交到本地 master 分支。

bash 复制代码
# 确保在 git_teaching 仓库目录下
zz@139-159-150-152:~/git_teaching$ pwd
/home/zz/git_teaching

# 查看当前文件列表 (只有克隆时自带的文件)
zz@139-159-150-152:~/git_teaching$ ls
README.en.md README.md

# 新建并编辑 file.txt 文件
zz@139-159-150-152:~/git_teaching$ vim file.txt
# 在 file.txt 中写入 "hello git"
zz@139-159-150-152:~/git_teaching$ cat file.txt
hello git

# Add 并 Commit 到本地仓库
zz@139-159-150-152:~/git_teaching$ git add .
zz@139-159-150-152:~/git_teaching$ git commit -m"create file.txt"
[master 7ce3183] create file.txt # 生成了新的本地 commit
 1 file changed, 1 insertion(+)
 create mode 100644 file.txt

现在,本地仓库的 master 分支比远程仓库的 master 分支多了一个提交 (7ce3183...)。

我们将本地 master 分支的修改推送到 origin 远程主机的 master 分支:

bash 复制代码
# 推送本地 master 分支到 origin 的 master 分支
zz@139-159-150-152:~/git_teaching$ git push origin master
Enumerating objects: 4, done. # Git 计算需要推送的对象
Counting objects: 100% (4/4), done.
Compressing objects: 100% (2/2), done.
Writing objects: 100% (3/3), 308 bytes | 308.00 KiB/s, done. # 正在写入对象
Total 3 (delta 0), reused 0 (delta 0)
remote: Powered by GITEE.COM [GNK-6.4] # 远程仓库的反馈
To gitee.com:zz91/git_teaching.git # 推送的目标地址
 c6ce3f0..7ce3183 master -> master # 本地 c6ce3f0..7ce3183 之间的提交被推送到远程的 master -> master

推送成功!

此时刷新 Gitee 仓库页面,你会看到 file.txt 文件以及你刚刚的提交 (create file.txt) 已经出现在远程仓库中了。

SSH vs HTTPS 推送: 使用 SSH 协议并配置好 SSH Key 后,git push 时通常无需输入密码。而使用 HTTPS 协议时,每次 git push 都可能需要你输入用户名和密码。这也是为什么团队协作和自动化脚本更偏爱 SSH 的原因。

拉取远程修改到本地仓库:git pull

在团队协作中,其他成员也会向远程仓库推送他们的修改。要获取这些修改并同步你的本地仓库,你需要从远程仓库拉取(Pull)代码。

命令: git pull <远程主机名> <远程分⽀名>:<本地分⽋名>

这个命令的意义是:"Git,请从 <远程主机名> 这个远程仓库的 <远程分支名> 分支上,抓取最新的提交,并尝试合并到我本地<本地分支名> 分支上。"

如果远程分支是与你当前所在的本地分支合并,可以省略冒号和本地分支名:

git pull <远程主机名> <远程分⽀名>

git pull** 的背后:** git pull 通常是两个命令的组合:

  1. git fetch <远程主机名> <远程分⽀名>:从远程仓库下载最新的提交到本地,但 自动合并。下载的提交会存储在本地一个特殊的远程跟踪分支中(比如 origin/master)。
  2. git merge <远程跟踪分⽀名>:将下载下来的远程跟踪分支中的提交,合并到你当前所在的本地分支。

所以,git pull 大致相当于先 Workspacemerge

操作演示:

假设你在 Gitee 网页上直接编辑了 README.md 文件并提交了修改(这模拟了其他人在远程仓库做了修改),此时远程仓库的 master 分支就领先于你的本地 master 分支一个提交了。

在 Gitee 网页上修改 README.md 并提交。

回到你的本地电脑,确保你在 git_teaching 仓库目录中,并且当前在 master 分支上。

bash 复制代码
# 确保在 master 分支
zz@139-159-150-152:~/git_teaching$ git branch
* master

# 拉取远程 origin 主机的 master 分支,并合并到当前的本地 master 分支
zz@139-159-150-152:~/git_teaching$ git pull origin master
remote: Enumerating objects: 5, done. # 下载远程新对象
...
Unpacking objects: 100% (3/3), 1.02 KiB | 1.02 MiB/s, done.
From gitee.com:zz91/git_teaching # 来自哪个远程仓库
 * branch master -> FETCH_HEAD # 抓取了远程 master 分支
 7ce3183..60e6b0a master -> origin/master # 更新了本地的远程跟踪分支 origin/master
Updating 7ce3183..60e6b0a # 正在将抓取到的提交合并到本地 master
Fast-forward # 合并模式:Fast-forward (因为本地 master 还没有新提交)
 README.md | 2 ++ # 文件改动统计
 1 file changed, 2 insertions(+)

# 查看 README.md 内容,应该包含了网页上的修改
zz@139-159-150-152:~/git_teaching$ cat README.md
... # 原有内容
第一次修改内容 # 网页上新增的内容

成功了!git pull 命令下载了远程仓库的新提交,并将其合并到了你的本地 master 分支,你的 README.md 文件也随之更新了。

如果在 git pull 时,本地当前分支有未提交的修改,或者本地分支与远程分支的历史发生了分叉,就可能会发生合并冲突,需要像我们之前讲的那样手动解决冲突。

总结远程操作

  • Git 是分布式的,每个人都有完整的本地版本库。
  • 远程仓库(如 GitHub、Gitee)用于方便大家交换彼此的修改。
  • git clone <URL>:从远程仓库下载一份完整的本地版本库。
  • 克隆通常使用 HTTPS 或 SSH 协议。SSH 需要配置 SSH Key 实现无密码推送。
  • git remote -v:查看本地仓库关联的远程主机信息。origin 是默认的远程主机名。
  • git push <远程主机名> <本地分⽀名>:将本地分支的提交上传到远程仓库的对应分支。
  • git pull <远程主机名> <远程分⽋名>:从远程仓库的指定分支抓取 最新提交并合并到本地当前分支。

掌握了本地操作和远程操作,你就已经具备了使用 Git 进行个人项目管理和参与团队协作的基础能力。Git 的世界还有更多精彩(比如远程分支管理、更复杂的合并策略、标签、远程协作流程等),但现在你已经迈出了最关键的一步!

相关推荐
计算机毕设定制辅导-无忧学长3 小时前
Kafka 核心架构与消息模型深度解析(一)
分布式·架构·kafka
一弓虽3 小时前
zookeeper 学习
分布式·学习·zookeeper
predisw4 小时前
kafka consumer group rebalance
分布式·kafka
明达技术5 小时前
ProfiNet 分布式 IO 在某污水处理厂的应用
分布式
云道轩5 小时前
llm-d:面向Kubernetes的高性能分布式LLM推理框架
分布式·容器·kubernetes
FakeOccupational6 小时前
【p2p、分布式,区块链笔记 MESH】Bluetooth蓝牙通信拓扑与操作 BR/EDR(经典蓝牙)和 BLE
笔记·分布式·p2p
司徒小夜6 小时前
处理git没做修改,但是文件显示变更的情况
git
m0_749317527 小时前
vscode里如何用git
ide·git·vscode
伤不起bb7 小时前
Kafka 消息队列
linux·运维·分布式·kafka
Hello.Reader7 小时前
Git 安装全攻略Linux、macOS、Windows 与源码编译
linux·git·macos