Git:一个程序员的“代码时间机器”

86 阅读5分钟

前言:为什么每个开发者都必须掌握 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"

这条命令会:

  1. 把暂存区的内容保存为一个新的版本
  2. 生成一个唯一的 ID(SHA 哈希值)
  3. 更新当前分支的最新提交

为什么用哈希而不是自增 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

最佳实践建议

  1. 每次提交都要有意义
    不要用 "update""fix",而是写清楚:“fix: 修复登录按钮点击无效

  2. 提交前先 git statusgit diff
    确保没有遗漏或误改。

  3. 定期提交
    不要等改完一堆东西才提交,及时保存进度。

  4. 不要害怕出错
    Git 有 reset, reflog 等工具,大多数错误都可以挽回。


fighting!!!