跳到内容

元数据卡: 前置知识:ch03-git-conflict.md | 预计时间:10 分钟 | 完成标志:能 push/pull/clone,理解 fetch vs pull

第五场战斗:想跟世界分享你的代码

你在自己的工坊里用 Git 已经用得越来越顺了。但你有几个朋友在另外的工坊里——他们也想看你锻造的成品和设计图。

"你把图纸誊抄一份送过来吧?"你的朋友说。

"不行,"你摇头,"我改完了他又得重新誊抄一整份。而且我俩各自改的地方肯定会打架。"

"那怎么办?"

你需要一个地方——不在你的工坊里,但在所有人之间——一个所有人都能访问的共享仓库。

这就是远程仓库的意义。最常见的平台有 GitHub、GitLab 和 Gitee。


关联远程仓库

你在 GitHub(或 GitLab/Gitee)上创建了一个叫 my-project 的仓库。平台会给你一个地址,类似 https://github.com/你的用户名/my-project.git

bash
# 把本地仓库和远程仓库关联起来
git remote add origin https://github.com/你的用户名/my-project.git

# 查看已关联的远程仓库
git remote -v

语言: Bash 如何运行: 在已初始化的本地仓库中执行 预期输出(git remote -v):

origin  https://github.com/你的用户名/my-project.git (fetch)
origin  https://github.com/你的用户名/my-project.git (push)

origin 是远程仓库的默认别名——就像给一个好朋友起了个外号。你可以改成别的名字,但约定俗成都叫 origin


推送代码到远程

bash
# 把你的代码推上去
git push -u origin master

语言: Bash 如何运行: 确保已关联远程仓库 预期输出:

Enumerating objects: 5 done.
Counting objects: 100% (5/5) done.
...
To https://github.com/你的用户名/my-project.git
 * [new branch] master -> master
Branch 'master' set up to track remote branch 'master' from 'origin'.

-u--set-upstream)的意思是"记住这次关联"——以后你只需要敲 git push 就行了,Git 知道推到哪里去。


克隆别人的仓库

别人想从你的远程仓库拿代码:

bash
git clone https://github.com/你的用户名/my-project.git
cd my-project

语言: Bash 如何运行: 在你想放项目的目录中执行 预期输出:

Cloning into 'my-project'...
remote: Enumerating objects: 5 done.
...
Receiving objects: 100% (5/5) done.

git clone 会自动:

  • 创建一个同名的本地目录
  • 把远程仓库的所有文件下载进来
  • 设置好 origin 关联
  • 切换到 master 分支

你拿到的是一个完整的、带有全部 Git 历史的仓库——不仅仅是当前文件。


第六场战斗:别人推了新代码,你想同步

你睡了一觉,第二天回到工坊,准备继续你的作品。但你习惯性地翻开共享的工坊日志本——发现隔壁工位的同事昨天新登记了十几次设计修改。

你的本地设计稿还是昨天早上的状态。你现在不能直接把自己的修改登记到共享日志上——因为你手头的版本已经落后了。

你需要拉取远程的最新代码:

bash
# 拉取远程最新代码并合并到本地
git pull origin master

语言: Bash 如何运行: 在本地仓库中执行,确保远程仓库有新提交 预期输出(顺利的情况):

remote: Enumerating objects: 3 done.
...
Updating a1b2c3d..f6g7h8i
Fast-forward
 utils.py | 10 ++++++++++
 1 file changed 10 insertions(+)

git fetch vs git pull

git pull 其实是由两个步骤组成的:

git fetch   → 把远程的新提交下载到本地(但不合并)
git merge   → 把下载的提交合并到你当前分支

所以 git pull = git fetch + git merge

如果你不想自动合并——比如你想先看看同事改了什么,再决定要不要合——可以拆开:

bash
# 第一步:下载远程最新内容
git fetch origin

# 第二步:看看别人改了什么
git log --oneline master..origin/master

# 第三步:确认没问题再合并
git merge origin/master

试试看: git fetch 后执行 git log --oneline HEAD..origin/master,看看"你还没有的提交"有哪些。

优先用 git fetch 而不是 git pull?不需要——绝大多数情况 git pull 就够了。但如果你想知道"别人改了啥,会不会和我冲突",先 fetch 再自行 merge 会更安全。


推送被拒绝了怎么办

你尝试 git push,得到报错:

! [rejected] master -> master (fetch first)
error: failed to push some refs

诊断: 你的本地版本落后于远程。远程上有你没有的提交。

解决: 先拉后推。

bash
git pull origin master   # 同步远程代码
# 如果有冲突,解决冲突并 commit
git push origin master   # 再推

下一步

你已经掌握了 Git 的完整工作流:本地存档、分支探索、合并成果、远程协作。但有没有更优雅的方式整理提交历史?团队协作里规范的分支模型是什么样的?

下一节是 选读进阶——rebase 整理历史、Pull Request 流程、GitHub Flow 概览。等你有团队协作需求时再回来看。

继续:Rebase、PR 与工作流模型

Built with VitePress | Software Systems Atlas