文档
Git 版本控制入门到协作教程
第一章:Git 的三种状态
工作目录 暂存区 Git 仓库
(Working) → (Staging) → (Repository)
↑ ↑ ↑
edit git add git commit
↑
git reset HEAD
commit 内部结构
每次 commit 是一个完整快照(非差异):
Commit Object → Tree Object → Blob (文件内容)
→ Tree (子目录)
→ parent Commit
第二章:分支本质
Git 分支是一个指向 commit 的40 字节 SHA-1 指针。
main: refs/heads/main → a1b2c3
feature: refs/heads/feature → d4e5f6
HEAD → refs/heads/feature (当前在 feature 分支)
这就是为什么:
- 创建分支几乎瞬间完成(写一个指针文件)
- 切换分支修改 HEAD 指向
git checkout -b=git branch+git checkout
第三章:合并策略对比
Fast-Forward(快进)
main: A---B
feature: C---D
合并后: A---B---C---D (main 直接移动到 D)
条件:feature 基于 main 最新 commit。
Three-Way Merge
main: A---B---E
feature: C---D
合并后: A---B---E---M (三方合并节点)
条件:两分支各有提交,不能快进。
Rebase
main: A---B---E
feature: C---D
变基后: A---B---E---C'---D' (历史线性)
适合个人分支整理,不要 rebase 公共分支。
第四章:远程协作
git remote add origin git@github.com:user/repo.git
git push -u origin main
git pull origin main # = fetch + merge
git fetch origin # 仅下载不合并
Pull Request (PR) 流程
- Fork 或创建 feature 分支
- 提交并 push 到远程
- 在 GitHub 发起 PR
- Code Review → CI 通过 → Merge
第五章:常用场景速查
| 场景 | 命令 |
|---|---|
| 撤销最后一次 commit(保留改动) | git reset --soft HEAD~1 |
| 修改最后一次 commit 信息 | git commit --amend -m "new msg" |
| 临时保存工作区 | git stash / git stash pop |
| 查看某文件谁改过 | git blame filename |
| 查找哪个 commit 引入 bug | git bisect |
| cherry-pick 单 commit | git cherry-pick <hash> |
| 删除远程 branch | git push origin --delete branch |
思考题
git merge和git rebase的根本区别是什么?各自适用场景?- detached HEAD 状态是什么?什么时候会进入这个状态?
.git目录里有什么?objects/和refs/各存什么?