Git 教程
Git 的核心并不只是记住命令,而是理解它的四个工作区域以及数据在这些区域之间是如何流动的。
本文将 Git 的体系分为“基础架构”和“核心功能”两部分来介绍。
Git 的体系架构
在深入功能之前,你需要理解 Git 追踪代码的四个位置:
- **工作区 (Workspace)**:你电脑里实际看到的文件夹,也就是你写代码的地方。
- **暂存区 (Index / Staging)**:一个临时的“缓冲带”,记录你准备提交哪些修改。
- **本地仓库 (Local Repository)**:存储在你电脑上的版本历史(位于
.git文件夹)。 - **远程仓库 (Remote Repository)**:托管在服务器上的代码库(如 GitHub、GitLab)。
核心功能详解
几个操作场景:
A. 获取与上传(与远程交互)
- 克隆(Clone):将远程仓库的完整代码、历史记录和分支下载到本地,创建一个全新的本地文件夹。
- 推送(Push):将你本地仓库的提交(Commit)上传到远程仓库,让团队成员看到你的更改。
- 拉取(Pull):将远程仓库的最新的代码下载并自动合并到你当前的工作中。
- 同步(Sync):这不是一个单一命令,通常指“先拉取再推送”的循环,确保本地和远程保持一致。
B. 保存与记录(本地版本管理)
- 提交(Commit):Git 的灵魂。它将暂存区的修改打包成一个“快照”,永久保存到本地仓库。每个提交都有一个唯一的哈希值。
- 显示日志(Log):查看历史账单。你可以看到谁在什么时候做了什么修改。
- 版本库浏览器(Repository Browser):通常指图形化界面(如 Sourcetree, GitKraken 或 VS Code 的 Git Graph),让你直观地看到分支的生长和交汇。
C. 差异与对比
- 比较差异(Diff):查看工作区和暂存区有什么不同;查看两个提交(Commit)之间改了哪些行。
D. 分支与合并(团队协作的核心)
- 切换/检出(Switch/Checkout):
- Switch:在不同的分支(如
main和feature)之间跳转。 - Checkout:一个老牌全能命令,既能切分支,也能从仓库里把某个旧文件“检出”来覆盖当前修改。
- Switch:在不同的分支(如
- 合并(Merge):将一个分支的修改集成到另一个分支。例如,把开发好的功能(Feature 分支)合并到主干(Main 分支)。
E. 临时处理与撤销(后悔药)
- 贮藏更改(Stash):非常实用! 如果你写到一半需要紧急切换分支处理 Bug,但又不想提交不完整的代码,可以用
stash把修改暂时“藏”起来,稍后再恢复。 - 还原(Restore / Revert / Reset):
- Restore:撤销工作区还没保存的修改。
- Revert:通过创建一个“反向”的新提交来抵消某次错误的提交(对团队协作安全)。
- Reset:强制将版本回退到过去的某个点(比较危险,需谨慎)。
常用功能对比表
| 功能 | 英文命令 | 主要作用 |
|---|---|---|
| 提交 | git commit |
将暂存区内容存档到本地库 |
| 拉取 | git pull |
获取远程更新并合并到本地 |
| 推送 | git push |
将本地存档上传到服务器 |
| 贮藏 | git stash |
暂时把手头的活儿搁一边,清空工作区 |
| 切换 | git switch |
在不同的开发任务(分支)间跳转 |
常用场景
场景一:拉取远程仓库代码,并完全覆盖掉我本地的代码
当你发现本地代码写乱了,或者想放弃所有本地修改,直接以远程仓库为准时,使用这个“重置”法。
1
2
3
4
5# 1. 下载远程仓库的最新元数据(不会影响你当前的代码)
git fetch --all
# 2. 将本地当前分支强制重置到远程分支的状态(以 main 分支为例)
git reset --all origin/main解释:
git fetch只是把更新拉下来存着,git reset --hard则是强制把你的工作区、暂存区和本地历史都同步成和远程一模一样。场景二:拉取远程代码,但保留我自己修改的代码
这是最常见的开发场景。如果你直接
git pull可能会遇到冲突,最好的做法是先“存”再“取”。方案 A:使用“贮藏” (Stash) —— 最推荐 如果你还没准备好提交代码:
1
2
3git stash # 把本地修改暂时“藏”起来,此时工作区变干净了
git pull # 拉取并合并远程代码
git stash pop # 把藏起来的修改“拿”出来,合入最新的代码方案 B:使用“变基” (Rebase) 如果你已经
commit了但还没push:1
git pull --rebase # 拉取远程代码,并将你的提交“接”在远程提交的后面
场景三:想撤销刚刚的提交
需求: 刚刚
git commit完,发现漏写了一个文件,或者备注写错了,想撤回这次提交但保留代码。命令:
git reset --soft HEAD~1效果: 撤销最近一次提交,但你的代码还在“暂存区”里,改完后再 commit 即可。
场景四:紧急修复 Bug,但手头工作没做完
需求: 正在开发新功能,老大突然说线上有个 Bug 要马上改,你不想提交半成品代码。
- 操作: 1.
git stash(藏起新功能代码) 2.git checkout main(切换去改 Bug) 3. 改完、提交、推送。 4.git checkout feature(回到新功能分支) 5.git stash pop(继续写代码)
- 操作: 1.
场景五:找回被误删的代码
需求: 正在开发新功能,老大突然说线上有个 Bug 要马上改,你不想提交半成品代码。
- 操作: 1.
git stash(藏起新功能代码) 2.git checkout main(切换去改 Bug) 3. 改完、提交、推送。 4.git checkout feature(回到新功能分支) 5.git stash pop(继续写代码)
- 操作: 1.
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来源 下雨の波比!

