大家好,我是程序员柏风,AI 最全的 Vibecoding 学习地图 http://coderoadmap.cn 作者。
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 的整体协作模型,理解开源世界是怎么运转的。