

文章目录
-
- 理解分布式版本控制系统
- 远程仓库
- [推送本地修改到远程仓库:`git push`](#推送本地修改到远程仓库:
git push
) - [拉取远程修改到本地仓库:`git pull`](#拉取远程修改到本地仓库:
git pull
) - 总结远程操作
好前面我们学习了 Git 的核心概念和本地操作:工作区、暂存区、版本库,以及提交、回退、分支管理。所有这些操作,都是在你自己的电脑上完成的。但是 Git 最重要的特点之一,在于它是 分布式版本控制系统 。这一章,我们来理解分布式以及如何与远程仓库协作。
理解分布式版本控制系统
我们之前所有的操作,比如 git init
创建仓库,git add
, git commit
, git branch
, git checkout
, git merge
等等,都是针对本地版本库进行的。这个本地版本库就在你自己的电脑硬盘上,包含了完整的项目历史记录。
什么是分布式?
分布式版本控制系统(Distributed VCS)最核心的特点是:每个参与开发的人电脑上,都有一个项目的完整版本库。不仅仅是最新代码,而是从项目诞生以来的所有历史记录、分支信息等等,都在每个人的本地。
这与传统的集中式版本控制系统(如 SVN)有很大不同。在集中式系统中,只有一个中央服务器拥有完整的版本库,你本地电脑上通常只保存当前工作所需的文件,你提交、更新、查看历史等所有操作都需要连接到中央服务器。服务器挂了或者网络断了,你就没法工作了。
分布式的优势:
- 离线工作: 因为你本地有完整的版本库,大部分操作(提交、查看历史、创建分支、合并分支等)都可以在没有网络的情况下进行。
- 高性能: 大部分操作都在本地完成,速度非常快。
- 数据安全: 版本库分布在多个开发者电脑上,即使某个电脑硬盘损坏,也可以轻松地从其他人的电脑上复制一个完整的版本库来恢复,数据的安全性大大提高。
- 灵活协作: 理论上,开发者之间可以直接通过网络互相推送和拉取修改,不需要固定的中央服务器。
分布式如何协作?
既然每个人都有完整的版本库,大家怎么同步彼此的修改呢?理论上,Git 允许任何两个版本库之间进行推送(push)和拉取(pull)修改。比如你修改了文件 A 并提交了,你的同事修改了文件 B 并提交了,你们只需要互相把各自的修改推送给对方的版本库,你们的本地版本库就会包含彼此的修改了。
在实际应用中,虽然理论上可以点对点推送,但通常为了方便管理和交换彼此的修改,大家会找一台"服务器"来充当一个集中的"中转站"。这台服务器上的版本库并没有什么特别之处,它也只是一个普通的 Git 版本库,但大家约定俗成地都向它推送自己的修改,也从它那里拉取别人的修改。这样,所有人的修改都通过这个"中转站"进行交换,协作就变得方便有序了。即使没有这个服务器,大家也能工作(只是交换修改不方便),所以它不是必需的,只是为了方便协作而存在的。
远程仓库
远程仓库(Remote Repository)就是存放在另一台计算机上的 Git 版本库。这个"另一台计算机"可能是你本地局域网的一台服务器,但更多时候,它指的是托管在互联网上的 Git 服务提供商的服务器,比如 GitHub、Gitee(码云)、GitLab、Bitbucket 等。这些平台提供了免费或付费的 Git 仓库托管服务。
克隆远程仓库: git clone
要开始和远程仓库协作,最常见的第一步就是从远程仓库**克隆(Clone)**一份完整的版本库到你自己的本地电脑上。
命令: git clone <远程仓库的 URL>
这个命令会完成几件事:
- 在当前目录下创建一个新的文件夹(通常以远程仓库的名称命名)。
- 在这个文件夹里初始化一个本地 Git 仓库 (
git init
)。 - 从远程仓库下载所有的数据(包括所有提交、分支等)。
- 根据下载的数据在本地重建完整的项目历史。
- 自动设置 这个远程仓库为你的本地仓库的"远程主机",并将其命名为
origin
(这是默认的远程主机名)。 - 自动创建并切换到本地
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_rsa
和 id_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 公钥设置页面:
- 给你的公钥取一个"标题"(比如"我的笔记本电脑")。
- 将你在第一步生成的
id_rsa.pub
文件中的全部内容 复制粘贴到"公钥"文本框里。id_rsa.pub
文件可以用文本编辑器打开查看内容。 - 点击"确定"或"添加"。平台可能会要求你再次输入账号密码进行确认。

完成后,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 添加到本地仓库的配置中,并将其命名为 origin
。origin
是克隆时创建的远程主机的默认名称。
你可以使用 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
在本地仓库进行开发,add
、commit
提交了一系列修改后,这些修改只存在于你的本地版本库中。要让这些修改同步到远程仓库,以便与他人协作或作为备份,你需要使用 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
通常是两个命令的组合:
git fetch <远程主机名> <远程分⽀名>
:从远程仓库下载最新的提交到本地,但不 自动合并。下载的提交会存储在本地一个特殊的远程跟踪分支中(比如origin/master
)。git merge <远程跟踪分⽀名>
:将下载下来的远程跟踪分支中的提交,合并到你当前所在的本地分支。
所以,git pull
大致相当于先 Workspace
再 merge
。
操作演示:
假设你在 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 的世界还有更多精彩(比如远程分支管理、更复杂的合并策略、标签、远程协作流程等),但现在你已经迈出了最关键的一步!