写完代码只存在自己电脑里,一旦硬盘坏了、换电脑了,一切归零;想跟别人合作,更不知道从哪下手。本文带你走完"本地仓库 → GitHub 远程仓库"的完整链路:从配置 SSH 密钥,到 push 推送、clone 克隆、pull 拉取,最后体验一次 fork 加 Pull Request 的开源协作流程。

1. 本地仓库与远程仓库

之前学过的 git init、git commit 都是在本地仓库里操作,数据只存在于你的磁盘上。而远程仓库是托管在服务器上的 Git 仓库,最常见的平台是 GitHub、GitLab 和 Gitee。本地与远程之间通过 git push(推送)和 git pull(拉取)同步。

为什么要用远程仓库?三个理由:第一,备份,代码丢在云端,换电脑不慌;第二,协作,多人各自克隆一份,改完推上去合并;第三,发布,开源项目和部署流水线都从远程仓库取代码。先注册一个 GitHub 账号,新建一个空的仓库(不要勾选"初始化 README"),然后回到终端。

2. 配置身份与 SSH 密钥

推送代码之前,Git 需要知道"你是谁",同时 GitHub 需要确认"你是你"。先设置全局身份:

git config --global user.name "你的名字"
git config --global user.email "你的邮箱"

这两条命令写入 ~/.gitconfig,之后所有仓库的提交都会带上这个身份。接着生成 SSH 密钥,这是免密推送的关键:

ssh-keygen -t ed25519 -C "你的邮箱"
# 一路回车即可,默认保存到 ~/.ssh/id_ed25519
cat ~/.ssh/id_ed25519.pub

ssh-keygen 生成一对密钥:私钥 id_ed25519 留在本地,公钥 id_ed25519.pub 复制到 GitHub 的 Settings → SSH and GPG keys → New SSH key 里。然后验证连通性:

ssh -T git@github.com
# 看到 Hi 用户名! 就说明通了

注意 ssh -T 是测试连接,不是真的登录;第一次连接会询问是否信任主机,输入 yes 即可。公钥相当于你的"门禁卡",可以放心公开,私钥则绝不能泄露。

3. 把本地仓库推送到 GitHub

假设你本地已经有一个仓库,现在把它和 GitHub 上的空仓库关联起来。GitHub 创建仓库后会给出一段提示,核心就是下面两条:

git remote add origin git@github.com:你的用户名/仓库名.git
git push -u origin main

git remote add 给远程仓库起个别名 origin(约定俗成表示"主远程");git push -u origin main 把本地 main 分支推上去,-u 建立追踪关系,以后直接 git push 和 git pull 就不用带参数了。检查关联是否成功:

git remote -v
# origin  git@github.com:用户名/仓库名.git (fetch)
# origin  git@github.com:用户名/仓库名.git (push)

看到两行 origin 就说明关联好了。如果仓库里还没有任何提交,git push 会报错 error: src refspec main does not match any,先 git add 和 git commit 一次再推。另外,如果之前用的是 HTTPS 地址、现在想换成 SSH,不需要删掉重加,一条 git remote set-url origin 新地址 就能改。

4. 克隆与拉取

在另一台电脑上,或者同事要接手你的项目,一条命令就能把整个仓库复制下来:

git clone git@github.com:用户名/仓库名.git
cd 仓库名

git clone 会自动完成三件事:下载所有历史、创建 origin 别名、建立本地分支与远程分支的追踪关系。克隆之后,别人在你之后推送了新提交,你需要同步:

git pull

git pull 等价于 git fetch 加 git merge:先把远程的新提交下载到本地,再合并进当前分支。如果想先看看远程有什么改动、暂不合并,可以只执行 git fetch,然后用 git log origin/main 查看差异。

这里有个常见误区:以为 git pull 会把远程的所有分支都拉下来。实际上 pull 只更新当前分支的追踪关系,远程的其他分支要先用 git fetch 下载,再 git checkout -b 分支名 origin/分支名 手动检出。团队里每个人都在推新分支时,这个动作几乎每天都要做。

5. Fork 与 Pull Request

如果你没有某个开源仓库的写权限,又想参与贡献,流程是:Fork(把项目复制到你的账号下)→ clone 你的副本 → 改代码 → push 到你的副本 → 在 GitHub 网页上发起 Pull Request。PR 是"请求别人合并我的改动",维护者审阅后点击 Merge 就合入了。

为了让自己的副本跟上游保持同步,通常还要加一个上游远程:

git remote add upstream git@github.com:原作者/仓库名.git
git fetch upstream
git merge upstream/main

upstream 指向原作者仓库,origin 指向你自己的 fork。先拉上游的新代码合并到本地,再推送到自己的 fork,这样发起 PR 时改动才是基于最新代码的,冲突会少很多。开源社区还有个不成文的习惯:PR 的标题和描述写清楚"改了什么、为什么改、怎么测试",维护者审查时能省一半时间,合入速度也快得多。

6. 总结与练习

本文走完了远程协作的主干:SSH 密钥打通认证,remote add 加 push 把本地代码送上 GitHub,clone 和 pull 把代码带回来,fork 加 PR 则让你能参与任何开源项目。练习建议:

💡 记住口诀:别人改完我 pull,我改完我 push;没权限就 fork,想合入就发 PR。远程协作的骨架就是这几个动作的循环。