大家好,我是程序员柏风,AI 最全的 Vibecoding 学习地图 http://coderoadmap.cn 作者。
Git
这一课你将能做到
- 用 Git 管理代码版本(提交、回滚、分支)
- 与团队协作(拉取、推送、解决冲突)
- 用 GitFlow 或主干开发模式组织分支
为什么要学
代码写错了想回到上一版?多人同时改一个文件怎么合并?线上出 bug 想快速回滚?Git 解决所有这些问题。它是程序员的「时光机」+「协作工具」。
人话:Git 是「代码的日记本」,每一次改动都记下来,随时翻回去看。
先建立图像
工作区 → 暂存区 → 本地仓库 → 远程仓库
(写代码) (git add) (git commit) (git push)
回滚方向:
远程仓库 → 本地仓库 → 暂存区 → 工作区
跟着做
步骤 1:初始化与基本操作
# 初始化仓库
git init
# 配置用户信息
git config --global user.name "Your Name"
git config --global user.email "you@example.com"
# 查看状态
git status
# 添加到暂存区
git add app.js # 单个文件
git add . # 所有改动
# 提交
git commit -m "feat: add login page"
# 查看历史
git log
git log --oneline # 简洁模式
git log --graph --oneline # 图形化分支
步骤 2:回滚
# 撤销工作区改动
git checkout -- app.js # 丢弃未暂存的修改
git restore app.js # 新命令
# 撤销暂存
git reset HEAD app.js # 从暂存区移除
# 回滚提交
git revert HEAD # 生成新提交,撤销上一次
git reset --hard HEAD~1 # 删除上一次提交(危险)
# 回滚到指定版本
git log --oneline # 找到 commit id
git reset --hard abc123 # 回滚到 abc123
步骤 3:分支操作
# 创建分支
git branch feature/login # 创建
git checkout feature/login # 切换
git checkout -b feature/login # 创建并切换
# 查看分支
git branch # 本地分支
git branch -r # 远程分支
git branch -a # 所有分支
# 合并分支
git checkout main
git merge feature/login
# 删除分支
git branch -d feature/login # 安全删除
git branch -D feature/login # 强制删除
步骤 4:远程仓库
# 关联远程仓库
git remote add origin https://github.com/yourname/myapp.git
# 推送
git push -u origin main # 首次推送
git push # 后续推送
# 拉取
git pull # = git fetch + git merge
# 克隆
git clone https://github.com/yourname/myapp.git
步骤 5:解决冲突
# 合并时出现冲突
git merge feature/login
# Auto-merging app.js
# CONFLICT (content): Merge conflict in app.js
# 查看冲突文件
git status
# 打开文件,看到冲突标记
// app.js
<<<<<<< HEAD
const port = 3000;
=======
const port = 8080;
>>>>>>> feature/login
# 手动编辑,选择或合并代码
const port = 3000;
# 标记已解决
git add app.js
git commit -m "merge: resolve conflict in app.js"
步骤 6:.gitignore
# .gitignore
node_modules/
.env
*.log
dist/
.DS_Store
步骤 7:GitFlow 工作流
# 主分支
main # 生产环境,只接受 release 和 hotfix 合并
develop # 开发主分支
# 功能开发
git checkout -b feature/login develop
# 开发、提交...
git checkout develop
git merge feature/login
git branch -d feature/login
# 发布
git checkout -b release/1.0.0 develop
# 测试、修 bug...
git checkout main
git merge release/1.0.0
git tag v1.0.0
git checkout develop
git merge release/1.0.0
# 热修复
git checkout -b hotfix/fix-login main
# 修复...
git checkout main
git merge hotfix/fix-login
git tag v1.0.1
git checkout develop
git merge hotfix/fix-login
提交信息规范
# 格式:type(scope): subject
git commit -m "feat(auth): add JWT login"
git commit -m "fix(api): handle null user"
git commit -m "docs: update README"
git commit -m "style: format code with prettier"
git commit -m "refactor(db): extract connection pool"
git commit -m "test: add user service tests"
git commit -m "chore: upgrade dependencies"
类型:feat 新功能、fix 修 bug、docs 文档、style 格式、refactor 重构、test 测试、chore 杂项。
讲清楚要点
- 三个区:工作区 → 暂存区 → 本地仓库,
git add推进,git checkout回退。 - 分支是指针:创建分支只是创建指针,切换分支是移动 HEAD 指针。
- merge vs rebase:merge 保留历史(有合并节点),rebase 线性历史(干净但改写历史)。
- pull = fetch + merge:拉远程代码并合并。
git fetch只下载不合并。 - revert vs reset:revert 生成新提交(安全),reset 删除提交(危险,远程已推送别用)。
你可能会懵的地方
-
Git 和 GitHub 区别? Git 是版本控制工具(本地);GitHub 是代码托管平台(远程)。还有 GitLab、Gitee。
-
merge 和 rebase 选哪个? 公共分支(main、develop)用 merge,保留历史;个人分支用 rebase,保持线性。
-
如何解决「detached HEAD」? HEAD 指向具体提交而非分支。
git checkout main回到分支。 -
git pull 报错 conflict? 本地和远程都改了同一文件。先
git stash暂存本地改动,git pull,再git stash pop恢复。 -
误删分支怎么恢复?
git reflog找到分支最后的 commit id,git checkout -b branch-name commit-id。
错法对照
| 错法 | 问题 | 正解 |
|---|---|---|
| 直接提交到 main | 没经过测试,可能挂掉 | 用 feature 分支 + PR 审核 |
| 提交信息写 "update" | 看不出改了什么 | 用规范格式 feat: add login |
| 把 node_modules 提交 | 仓库巨大 | 加 .gitignore |
强推 git push -f | 覆盖远程,别人代码丢失 | 只对个人分支强推 |
| 一次性提交所有改动 | 回滚困难 | 按功能拆分提交 |
卡点急救
- 误删未提交的改动:
git checkout -- file可恢复已跟踪文件;未跟踪文件删了就没了。 - 提交到错误分支:
git cherry-pick commit-id把提交拿到正确分支,再删除错误提交。 - 本地领先远程,但想放弃本地:
git reset --hard origin/main(危险,本地改动全丢)。
面试常问
-
Git 工作原理? 快照而非差异。每次提交保存整个项目的快照,用 SHA-1 哈希标识。
-
merge 和 rebase 区别? merge 保留分支历史(有合并节点);rebase 把提交「嫁接」到目标分支,历史线性但改写了提交。
-
如何撤销已推送的提交?
git revert commit-id生成反向提交,安全;git reset --hard危险,需要git push -f。 -
Git 对象类型? blob(文件内容)、tree(目录)、commit(提交)、tag(标签)。
自测三问
git reset --soft、--mixed、--hard的区别?- 如何把多个提交合并成一个?
- 冲突解决后如何继续合并?
小结一句话
Git 用快照管理代码历史,分支实现并行开发,merge/rebase 合并代码,规范提交信息便于协作。
延伸
- Pro Git 中文版
- 下一课:GitHub 协作开发。