前言:为什么每个开发者都必须掌握 Git?
你有没有遇到过这些场景?
- 写了一整天的代码,结果一不小心删错了文件。
- 和同事协作时,谁改了什么、怎么改的,完全搞不清楚。
- 需要回退到三天前的功能,却不知道从哪里下手。
这些问题,Git 可以帮你全部解决。
Git 是世界上最流行的版本控制系统,它就像一个“代码时间机器”——让你随时回到过去,查看每一次修改,甚至恢复被删除的内容。
一、什么是 Git?它到底在做什么?
Git 是一个分布式版本控制系统,它的主要作用是:
管理代码的不同版本
记录每一次修改
支持多人协作开发
举个生活中的例子:
想象你在写一篇作文,每次修改都保存为一个新的副本:
- 第1版:初稿
- 第2版:加了开头
- 第3版:改了结尾
但这样太占空间,也不方便对比。而 Git 就像一个智能助手,它只记录“这次改了什么”,而不是整个文件。
比如:
+ 这是新增的一句话
- 这是删除的一句话
这样既节省空间,又能快速还原任意版本。
二、初始化仓库:让项目“拥有记忆”
当你在一个项目目录中运行:
git init
你就创建了一个 Git 仓库。这个命令会在当前目录下生成一个隐藏文件夹 .git,它是 Git 的“大脑”,负责存储所有版本信息。
⚠️ 注意:同一个项目中不能有多个 Git 仓库!否则会混乱不堪。
示例操作:
mkdir my-project
cd my-project
git init
现在你的项目已经“激活”了 Git,可以开始管理代码了。
三、查看状态:git status
这是你每天使用最多的命令!
git status
它告诉你:
- 哪些文件被修改了?
- 哪些文件还没添加到 Git?
- 当前分支是什么?
实际例子:
假设你新建了一个 readme.txt 文件:
echo "Hello World" > readme.txt
git status
输出可能是:
Untracked files:
(use "git add <file>..." to include in what will be committed)
readme.txt
这说明:readme.txt 是未跟踪的文件,还没有被 Git 管理。
四、添加文件到暂存区:git add
把文件加入 Git 的第一步是“添加”到暂存区(stage)。
git add readme.txt
现在再运行 git status,你会看到:
Changes to be committed:
(use "git restore --staged <file>..." to unstage)
new file: readme.txt
意味着:文件已准备好提交。
类比:就像拍照前先对焦,拍完照才是“提交”。
五、提交更改:git commit
当文件进入暂存区后,就可以正式提交了。
git commit -m "wrote a readme file"
这条命令会:
- 把暂存区的内容保存为一个新的版本
- 生成一个唯一的 ID(SHA 哈希值)
- 更新当前分支的最新提交
为什么用哈希而不是自增 ID?
因为 Git 是分布式系统,多人协作时如果用自增 ID(如 1, 2, 3),容易冲突。而 SHA 哈希是基于内容生成的,全球唯一,不会重复。
例如:
fc19bcd (HEAD -> master) append GPL
这里的 fc19bcd 就是本次提交的唯一标识。
六、查看差异:git diff
在提交前,我们通常需要确认自己到底改了什么。
git diff
它会显示工作区和最近一次提交之间的差异。
示例:
如果你修改了 readme.txt,添加了一句:
Git tracks changes of files.
运行 git diff 会输出:
+ Git tracks changes of files.
这样你就能清楚地知道哪些内容即将被提交。
建议:重大提交前一定要
git diff一下,避免误提交!
七、版本回退:git reset --hard
有时候我们会犯错,比如提交了不该提交的内容,或者想回到之前的某个状态。
Git 提供了强大的“时光倒流”功能:
git reset --hard HEAD^
HEAD:指向当前分支最新的提交^:表示“上一个版本”^2:表示“上上个版本”
实际例子:
假设你有以下提交历史:
A -> B -> C (当前)
执行:
git reset --hard HEAD^
就会回到提交 B,C 被永久删除(慎用!)。
如果你想回退到某个具体版本,可以用:
git reset --hard fc19bcd
其中 fc19bcd 是你想回到的那个提交的哈希值。
⚠️ 注意:
--hard会丢弃所有未提交的修改,使用前请备份!
八、查看提交历史:git log
想知道项目是怎么一步步发展的?用:
git log
它会列出所有提交记录,包括作者、时间、提交信息等。
为了更清晰,推荐使用:
git log --oneline
输出类似:
fc19bcd append GPL
e1a9112 add LICENSE and modify readme.md
30fdd1b git tracks changes
每行是一个提交,前面是短 ID,后面是描述。
九、查看完整操作日志:git reflog
有时候你做了 reset 操作,发现后悔了,怎么办?
别担心,git reflog 是你的“后悔药”。
git reflog
它会记录你对 Git 所做的每一个操作,比如:
100d468 (HEAD -> master) HEAD@{0}: commit: add of files
30fdd1b HEAD@{1}: commit: git tracks changes
fc19bcd HEAD@{2}: reset: moving to fc19bcd
即使你回退到了旧版本,也能通过 reflog 找到原来的提交点,再用 reset 回去。
十、撤销修改:git checkout --
如果你只是修改了文件,但还没提交,又不想保留这些改动,可以用:
git checkout -- readme.txt
这会把 readme.txt 恢复成最近一次提交时的状态。
类比:就像 Word 中的“撤销”功能。
十一、关键概念总结
| 概念 | 说明 |
|---|---|
| HEAD | 指向当前分支最新的提交 |
| 暂存区(Stage) | 修改后等待提交的地方 |
| 提交(Commit) | 一个完整的版本快照 |
| 分支(Branch) | 代码的不同路线,比如 main, feature/login |
最佳实践建议
-
每次提交都要有意义
不要用"update"或"fix",而是写清楚:“fix: 修复登录按钮点击无效” -
提交前先
git status和git diff
确保没有遗漏或误改。 -
定期提交
不要等改完一堆东西才提交,及时保存进度。 -
不要害怕出错
Git 有reset,reflog等工具,大多数错误都可以挽回。
fighting!!!