CodeRoadMap
首页路线题库资源库文章社区
CodeRoadMap

程序员的学习成长路线图。内容免费开放,登录后可同步路线图与课时进度。

由 程序员柏风 独立维护 · 关于作者

学习

  • 路线图
  • 课程
  • 面试题
  • 文章
  • 我

更多

  • 资源
  • 社区
  • 关于作者
  • 内容说明

© 2026 CodeRoadMap

津ICP备2026012044号-1·津公网安备12011002026155号·coderoadmap@126.com
Git/GitHub 入门实战/课时/GitHub 入门
RawBlame
课时目录12 节

Git/GitHub 入门实战

  1. 01Git 基础概念
  2. 02基本 Git 操作
  3. 03Git 进阶
  4. 04GitHub 入门
  5. 05协作基础
  6. 06分支工作流
  7. 07Pull Request
  8. 08Issues 管理
  9. 09团队协作
  10. 10安全习惯
  11. 11路线图对照
  12. 12综合练习

GitHub 入门

远程、push/pull 与 Fork。

30 分钟

GitHub 入门

这一课你将能做到

  1. 把本地仓库通过 git remote add 关联到 GitHub,并用 git push -u 首次推送
  2. 说清 origin、origin/main、本地 main 三者的关系
  3. 用 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 并创建远程仓库

  1. 访问 github.com 注册账号
  2. 右上角 + → New repository
  3. 仓库名填 git-demo,选 Public,不要勾选「Initialize with README」(避免首次 push 冲突)
  4. 创建后页面会显示仓库地址,形如 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。

讲清楚要点

  1. origin 只是别名:它是远程仓库 URL 的简写,默认叫 origin,也可以叫别的(比如 upstream 表示上游原始仓库)。
  2. origin/main 是远程跟踪分支:它是本地缓存的「远程 main 指针位置」,只读。git fetch 才会更新它。所以 git status 显示「领先 1 个提交」意思是:本地 main 比 origin/main 新 1 个 commit。
  3. push 是把本地 commit 上传到远程:只有 push 之后别人才能看到。本地 commit 一百次,不 push 等于没发生。
  4. pull = fetch + merge:fetch 只下载不动你的工作区,merge 把远程改动合并进当前分支。想更干净可 git pull --rebase(进阶用法)。
  5. 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,泄露后立刻吊销并轮换

卡点急救

  1. push 被拒 non-fast-forward:git pull 拉下远程改动,如有冲突按提示修改冲突文件、git add、git commit,再 push。
  2. SSH 连不上 Permission denied (publickey):检查 ssh -T git@github.com;确认 ~/.ssh/id_ed25519.pub 已粘贴到 GitHub;Windows 上确认 ssh-agent 已启动。
  3. 误 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。

自测三问

  1. git push -u origin main 中 -u 干了什么?
  2. 为什么 push 之前通常要先 pull?
  3. origin/main 是真实存在的分支吗?存在哪里?

小结一句话

GitHub 是 Git 仓库的云端家,remote add + push 把本地历史同步上去,pull 把别人的改动拉下来,从此你的代码有了备份也有了协作的舞台。

延伸

  • GitHub 官方文档
  • 下一课:协作基础——Fork、Clone、Pull Request 的整体协作模型,理解开源世界是怎么运转的。
加载本节练习…
← 上一课Git 进阶下一课 →协作基础