CodeRoad Map 程序员的学习成长路线图。内容免费开放,登录后可同步路线图与课时进度。
由 程序员柏风 独立维护 · 关于作者
学习 更多
GitHub 入门 远程、push/pull 与 Fork。
GitHub 入门
这一课你将能做到
把本地仓库通过 git remote add 关联到 GitHub,并用 git push -u 首次推送
说清 origin、origin/main、本地 main 三者的关系
用 SSH 或 Personal Access Token 完成 GitHub 身份认证
为什么要学
Git 是本地工具,GitHub 是云端协作平台。没有 GitHub,你的代码只在自己电脑上——硬盘坏了全完,也没法和队友协作。把代码推上 GitHub 后,你获得了:异地备份、多人协作、Pull Request 评审、Issues 管理、CI/CD 自动化、开源展示(简历加分项)。
本站 java-nav 的代码就托管在 GitHub,你看到的课程、路线图,都是通过 Git 工作流合并进主干的。
先建立图像
本地与远程的对应关系:
你的电脑 GitHub 云端
┌─────────────────────┐ ┌─────────────────────┐
│ 工作区 → 暂存区 → 本地仓库 │ push │ 远程仓库 origin │
│ main │ ─────────────> │ main │
│ │ <───────────── │ │
│ 远程跟踪分支 │ fetch/pull │ │
│ origin/main(只读) │ │ │
└─────────────────────┘ └─────────────────────┘
关键概念:origin 是远程仓库的默认别名;origin/main 是你本地缓存的「远程 main 长什么样」的快照,只读,不随你的提交变化。
跟着做
步骤 1:注册 GitHub 并创建远程仓库
访问 github.com 注册账号
右上角 + → New repository
仓库名填 git-demo,选 Public,不要勾选 「Initialize with README」(避免首次 push 冲突)
创建后页面会显示仓库地址,形如 https://github.com/你的用户名/git-demo.git
步骤 2:配置认证(SSH 推荐)
# 生成 SSH 密钥(一路回车)
ssh-keygen -t ed25519 -C "zhangsan@example.com"
# 查看公钥内容
cat ~/.ssh/id_ed25519.pub
复制输出的整串(ssh-ed25519 AAAA...),打开 GitHub → Settings → SSH and GPG keys → New SSH key,粘贴保存。
验证:
ssh -T git@github.com
# Hi zhangsan! You've successfully authenticated...
步骤 3:关联远程仓库
回到第一课创建的本地 git-demo 目录:
cd git-demo
git remote add origin git@github.com:你的用户名/git-demo.git
git remote -v
# origin git@github.com:你的用户名/git-demo.git (fetch)
# origin git@github.com:你的用户名/git-demo.git (push)
git remote -v 验证关联成功。
步骤 4:首次推送 git branch -M main # 确保主分支叫 main
git push -u origin main
# Enumerating objects: 3, done.
# To github.com:你的用户名/git-demo.git
# * [new branch] main -> main
-u(--set-upstream)建立本地 main 和 origin/main 的追踪关系,以后直接 git push / git pull 就行。
步骤 5:日常推拉 # 改点东西再提交
echo "第二行" >> README.md
git add . && git commit -m "docs: 更新 README"
git push # 推送到远程
# 模拟队友推了新提交后,你拉取
git pull # = git fetch + git merge
步骤 6:查看远程信息 git branch -a # 列出本地+远程所有分支
# * main
# remotes/origin/main
git log --oneline --graph --all # 同时看到本地与远程的差异
git status
# Your branch is ahead of 'origin/main' by 1 commit.
git status 会告诉你本地领先/落后远程几个 commit。
讲清楚要点
origin 只是别名 :它是远程仓库 URL 的简写,默认叫 origin,也可以叫别的(比如 upstream 表示上游原始仓库)。
origin/main 是远程跟踪分支 :它是本地缓存的「远程 main 指针位置」,只读。git fetch 才会更新它。所以 git status 显示「领先 1 个提交」意思是:本地 main 比 origin/main 新 1 个 commit。
push 是把本地 commit 上传到远程 :只有 push 之后别人才能看到。本地 commit 一百次,不 push 等于没发生。
pull = fetch + merge :fetch 只下载不动你的工作区,merge 把远程改动合并进当前分支。想更干净可 git pull --rebase(进阶用法)。
SSH vs HTTPS :SSH 配一次终身免密,推荐;HTTPS 每次需要 Personal Access Token(GitHub 已禁用密码推送)。
你可能会懵的地方
git fetch 和 git pull 区别?
fetch 只把远程最新状态下载到本地的 origin/main,不动你的工作区;pull 是 fetch 之后立刻 merge 到当前分支。新手建议先用 fetch 看看远程有什么变化,再决定 merge 还是 rebase。
push 提示 rejected: non-fast-forward?
远程有人推了新 commit,你的本地历史「落后」了。先 git pull 合并远程改动,解决可能的冲突后再 push。
本地分支名和远程分支名必须一致吗?
不必须,但强烈建议一致。不一致时 push 要写全:git push origin 本地名:远程名。
克隆别人的项目能 push 吗?
不能。你只读。要贡献得先 Fork(复制一份到自己账号下),改完从自己仓库发 Pull Request。
.git/config 里能看到 remote 配置吗?
能。git remote add 其实就是往这个文件写 [remote "origin"] 配置段。
错法对照 错法 问题 正解 创建远程仓库时勾选 README,本地又已 init 两边都有初始 commit,push 被拒 远程建空仓库;或本地先 git pull --rebase origin main 直接把密码当 HTTPS 密码输入 GitHub 2021 起禁用密码 用 SSH 或 Personal Access Token 半年不 pull 就在老代码上开发 合并时冲突爆炸 每天开工前先 git pull 在公共分支上 git push --force 队友历史被覆盖 强推只用于自己的个人分支 把 .env、密钥 push 到公开仓库 密码泄露被扫走 提交前检查 .gitignore,泄露后立刻吊销并轮换
卡点急救
push 被拒 non-fast-forward :git pull 拉下远程改动,如有冲突按提示修改冲突文件、git add、git commit,再 push。
SSH 连不上 Permission denied (publickey) :检查 ssh -T git@github.com;确认 ~/.ssh/id_ed25519.pub 已粘贴到 GitHub;Windows 上确认 ssh-agent 已启动。
误 push 了大文件/密钥 :未合并到 main 前,用 git reset --soft HEAD~1 回退本地提交,删除文件后重新 commit,再 git push --force-with-lease(仅限个人分支)。已泄露的密钥立刻去对应平台吊销。
面试常问
origin/main 和 main 的区别?
main 是你本地分支,随你的 commit 前进;origin/main 是本地缓存的「远程 main 的位置」,只在 fetch/pull/push 时更新。git status 显示「ahead 1」就是本地 main 比 origin/main 多 1 个 commit。
git pull 和 git fetch 的区别?
fetch 只同步远程引用到本地(更新 origin/main),不动工作区;pull = fetch + merge(或 rebase)。fetch 是只读安全操作,pull 可能产生冲突。
什么是 upstream?
当你 Fork 了别人的仓库,你自己账号下那份通常叫 origin,原始项目那份叫 upstream。同步上游最新代码:git fetch upstream && git merge upstream/main。
自测三问
git push -u origin main 中 -u 干了什么?
为什么 push 之前通常要先 pull?
origin/main 是真实存在的分支吗?存在哪里?
小结一句话 GitHub 是 Git 仓库的云端家,remote add + push 把本地历史同步上去,pull 把别人的改动拉下来,从此你的代码有了备份也有了协作的舞台。
延伸
GitHub 官方文档
下一课:协作基础——Fork、Clone、Pull Request 的整体协作模型,理解开源世界是怎么运转的。