Git GitHub教程

skillgohub.com 中文指南 | 中文版

Git GitHub教程

两年前我亲眼看着一位同事把整个团队的主分支删了。她的命令历史里躺着一条`git push origin main --force`,起因是一次搞砸了的 rebase。当 GitHub 通知我们 40 个文件消失时,我体会到了那种"撤销键竟然不存在"的恐慌——至少不是我们练熟的那种。好在她本地的 reflog 里还留着每一个提交。什么都没有真正丢失,只是我们还不知道怎么把它找回来。这才是版本控制的真相:git 几乎从不摧毁你的工作,它只是把它藏在一些你还没学会的命令后面。这份教程要把这个知识盲区变成习惯,带你过一遍日常流程、分支、重写历史、协作,以及那些让真实团队搭上整个周末的坑。

这个投入是有回报的。在 2026 年的 Stack Overflow 开发者调查里,git 仍然接近人手一份——超过 90% 的受访者都在用——但有相当一部分人承认自己有过"迟迟不敢提交""历史一团糟"和"事后后悔的强推"经历。git 不难,不是因为概念难,而是因为词汇密度高、失败模式又不留情面。一旦你把它重新想成"一张戴着标签的快照图",后面的一切就都清晰了。

用快照和一个叫 HEAD 的移动标签来思考

去掉行话,git 就是一张有向无环图。每一次提交都是你整个项目在某个时间点的快照,外加一个指向其父提交的指针。分支不是副本——它们只是挂在某个提交上的可移动标签。HEAD 是一个特殊标签,表示你当前正工作的提交。这个心智模型解释了为什么 git 操作快得像闪电:创建分支是一行动标签,不是复制文件;合并是尝试把两条分支历史组合起来。

git-github-tutorial illustration

具体地说,当你运行`git checkout -b feature`时,你是在创建一个指向当前提交的新标签,并把 HEAD 移上去。当你提交时,你在创建新快照并把当前分支标签往前推。Rebase 是把你的提交"重放"到另一个基础上,重写它们的父指针。一旦明白了"分支是便宜的标签",对创建分支的恐惧就烟消云散了——任何超过十分钟的任务,你都该开个分支。

能救命的是"及时提交推送"的日常循环

比任何高级技巧都更能救人的习惯,是尽早、频繁、带着意图地提交。一套实用的日常循环长这样:

git-github-tutorial illustration
  1. `git status`看清到底改了什么——永远别靠猜。
  2. `git diff`在暂存前先看真实改动;diff 是你抓住一个误入的调试日志或一个改坏文件的时机。
  3. `git add `只暂存与本次逻辑改动相关的文件;习惯性整目录暂存,会把无关改动也埋进去。
  4. `git commit -m "fix: 处理 auth 里的空 token"`用一条说明"改了什么、为什么"的消息,而不是"怎么改的"。
  5. `git push`到远程分支,最好在测试通过之后。

小而聚焦的提交造就可搜索的历史,也让`git bisect`——那个定位"是哪次提交搞挂了测试"的工具——变得好用得多。一次改动 10 个不相关文件的大提交,是你以后想理解或回退某个单一行为的队友的一颗地雷。

分支策略:主干开发 vs 功能分支

团队总是为"正确"的分支模型争执不休,但两个现实选项是:主干开发,以及带 Pull Request 的长期功能分支。主干开发在很多大型互联网公司和持续交付团队里被高度采用,大家都以小块增量提交到主分支、靠功能开关兜底,于是集成一直在发生,合并冲突也一直很小。功能分支流则由 GitHub Flow 和 GitFlow 倡导,把工作隔离在独立分支上,通过 PR 评审后再合并进主分支。

git-github-tutorial illustration

对小团队而言,一条好走的中路是:短命的功能分支(一两天),受保护的主分支(要求 PR 和通过的 CI),以及频繁 rebase 到更新的主分支上以免漂移。对刚深入现代 React 的人来说,这种集成风格和你在一份标准组件评审里看到的重叠度挺高,想要并列补组件开发知识,可看我的React Hooks 教程;想理解分支代码之外的整体工程链路,Docker 入门 2026也是好入口。所有模型共用的铁律只有一条:不要重写已经推送、已经共享的历史——否则协作者的仓库会和远程"沉默地互相打架"。

揭开 reflog、reset、rebase 的面纱

有三个命令让新手害怕、却让老手活命:reflog、reset、rebase。reflog 是 git 本地安全网——一张记录 HEAD 去过哪里(包括你用 reset 或 amend"删掉"过的提交)的日志。误用了`git reset --hard`之后的第一急救,就是`git reflog`,找到你想要的提交,然后`git reset --hard `或`git branch rescue `。我们就是靠它找回被删的主分支的:那些提交其实还在 reflog 里。

git-github-tutorial illustration

`git reset`移动 HEAD,并可选的移动暂存区或工作区,取决于`--soft`、`--mixed`、`--hard`这几个旗标——它是撤销本地暂存错误的工具。`git rebase`通过把你的提交重放到新基础上来重写提交历史,这对让功能分支相对主分支保持整洁很理想,但它会重写提交哈希,所以绝不能碰共享分支。合并路径请优先用`git merge`;merge 保留历史,也避免了"强推盖掉同事工作"这一类事故。

把协作和 Pull Request 做对

版本控制三成是机制,七成是"社交工程"。PR 是评审发生的地方,所以一个好的 PR 要小、要聚焦、要描述清楚。约定式提交——`feat:`、`fix:`、`docs:` 这类前缀——让变更日志和`git log --oneline`瞬间可扫,也喂得动自动发布说明。评审人要读 diff,而不是只读描述;一个不看代码就点赞的评审人,是披着速度外衣的责任隐患。

git-github-tutorial illustration

处理合并冲突,是区分初级和中高级工程师的能力。正确姿态是:靠理解两边来解决冲突,而不是无脑保留自己的。当两个分支都改了同一批代码行,打开合并后的文件,检查`<<<<`、`====`、`>>>>`这三类标记,保留或结合语义上正确的部分,然后删掉标记。基于 rebase 的冲突会把你的提交重放到新基础上,所以你在新上下文里一次解决即可,不用留一个掩埋了解决过程的合并提交。如果团队需要补前面的基础,那份更完整的Git 版本控制指南用一条龙把命令清单串起来了;想回头补编程底子,我的Python 零基础入门也能帮新手更快上手命令行。

怎么挑 Git 托管平台和工具

工作流很大程度上由你选的托管平台和 GUI 塑造,而实际的价格权衡对个人开发者和小团队都很重要。

平台/工具主要功能价格参考
GitHub免费私有仓库、Actions CI/CD、PR、Codespaces、问题跟踪个人与小团队免费;Pro 约 4 美元/月
GitLab内置 CI/CD、可自托管、容器仓库、里程碑免费档;Premium 约 29 美元/人/月;自托管免费
BitbucketJira 集成、Pipelines CI/CD、分支权限、仓库5 人以内免费;Standard 约 3 美元/人/月
Azure DevOps / ReposAzure Pipelines、无限私有仓库、工作项跟踪5 人及免费用例 + 免费管道分钟数
SourceTree免费桌面 GUI、可视化 diff/merge、Git-flow 集成免费
GitKraken跨平台 GUI、图形视图、提交看板、CLI公共仓库免费;Pro 约 4.95 美元/月

对个人学习者,GitHub 的免费档绰绰有余——私有仓库、Actions、公共项目上的无限协作者。对已经在 Atlassian 生态里的团队,Bitbucket 和 SourceTree 能减少来回切上下文。选择的差别,小于"你始终小步提交、诚实评审"这一点的一致性。

逃离 Git 地狱:救场剧本

当出问题时,忍住`rm -rf .git`重来的冲动。下面是专业管理员会按序做的排查:

掌握这套剧本,能把最糟的 git 事故从"存在性恐惧"变成"五分钟的事"。想一周入门代码功力,我的每天 15 分钟学编程把命令压缩成可训练的序列,帮你把习惯钉牢。

常见问题

git merge 和 git rebase 有什么区别?

merge 通过创建一个新的合并提交结合两条分支历史,同时保留两段过去;rebase 把你的分支提交重写到另一个基础之上,得到一条线性历史。共享集成路径用 merge 保留历史、避免重写已推送提交;想在更新后的主分支上保持本地功能分支整洁,用 rebase。金科玉律:绝不 rebase 别人已经拉取过的提交。

为什么我的强推删了同事的工作?

`--force`强推会用你的本地历史覆盖远程分支引用,丢弃所有"你本地副本里没有、但远程有"的提交。如果同事在你上次 fetch 之后才推送,那些提交就从分支上消失了。解法是配分支保护规则(要求拒绝非快进),并用`--force-with-lease`——它会在远程已经比你上次 fetch 之后移动时拒绝推送。

怎么撤销已经推送的提交?

优先用`git revert `,它创建一个逆转该改动的新提交,保住历史、利于协作。只有当你确定自己是该分支唯一贡献者、能安全重写共享历史时,才用`git reset`再接`git push --force-with-lease`。默认走 revert 才是专业的,因为它不需要任何别人去调和他们的历史。

我的提交信息应该长什么样?

用祈使语气,标题控制在 50 字符以内,需要时空一行再加解释"为什么"的正文。用约定式提交前缀(`feat:`、`fix:`、`docs:`、`refactor:`)以启用工具和可扫日志。一条好的消息要说"改了什么、为什么",而不是只列"动了哪些文件"——"fix: 处理空会话 token"就比"更新了文件"强。

git 只适合程序员吗?

不是。git 对任何以文本为主的项目都有用——文档、配置文件、数据管道,甚至以文本形式存在的设计稿。写作者越来越多地用它追踪草稿,基础设施即代码团队把它当强制要求。技能是可迁移的,因为快照图的模型适用于任何一套带版本的文件,而不只是源代码。

📌 Pinterest 🐦 Twitter 📘 Facebook