跳转到内容

Git 基础操作:给代码买一份"后悔药"

完成时间:约 25 分钟。读完后你能看懂 AI 帮你执行的 Git 操作,自己也能完成最基本的版本管理。

CS 入门那一章我们提过:Git 就像 Word 的修订历史,但管的是整个项目。这一章不讲概念了,直接讲怎么用


很多人觉得”等我开始写代码了再学 Git”。错了——AI 帮你写代码的时候,你就已经需要 Git 了。

当你用 Claude Code 开发项目时,它会直接帮你执行 git commitgit push 这些命令。如果你完全看不懂它在做什么,就像坐在副驾驶却不认识仪表盘——出了问题你都不知道发生了什么。

类比:Git 就像游戏的”存档”功能。

  • 打 Boss 之前先存个档
  • 打输了?读档重来
  • 想试试不同路线?开一个新存档槽

写代码也一样:改代码之前先 commit(存档),改坏了就回退(读档),想试新方案就开分支(新存档槽)。


Git 的工作流程可以理解为文件在四个区域之间流动:

┌──────────┐ git add ┌──────────┐ git commit ┌──────────┐ git push ┌──────────┐
│ │ ────────► │ │ ──────────► │ │ ────────► │ │
│ 工作区 │ │ 暂存区 │ │ 本地仓库 │ │ 远程仓库 │
│ │ │ (staging) │ │ │ │ (GitHub) │
│ │ ◄──────── │ │ │ │ ◄──────── │ │
└──────────┘ 编辑文件 └──────────┘ └──────────┘ git pull └──────────┘

一句话理解每个区域:

区域是什么类比
工作区你正在编辑的文件你面前的草稿纸
暂存区执行 git add 后,准备提交的文件把写好的草稿放进信封
本地仓库执行 git commit 后,已保存的历史记录信封封好,归档到你的文件柜
远程仓库执行 git push 后,上传到 GitHub 的备份把文件柜的副本寄到银行保险箱

Git 需要知道”谁在提交代码”,所以第一次用之前要配置你的名字和邮箱:

Terminal window
git config --global user.name "你的名字"
git config --global user.email "你的邮箱"

这只需要做一次,以后所有项目都会使用这个身份。

提示:邮箱建议用你注册 GitHub 时的邮箱,这样提交记录能关联到你的 GitHub 账号。


这 6 个命令覆盖了 90% 的日常使用场景。

Terminal window
git clone https://github.com/用户名/项目名.git

一句话:从 GitHub 复制一份完整的项目到你的电脑上。

什么时候用:第一次获取一个项目的时候。类似于从网盘下载一个文件夹,但它还带着完整的历史记录。


Terminal window
git status

一句话:告诉你哪些文件被改了、哪些已经放进暂存区、哪些还没有。

什么时候用:随时都可以用,就像低头看一眼仪表盘。不确定当前情况的时候就敲一下,不会有任何副作用。

输出示例:

Changes not staged for commit:
modified: src/App.js ← 改了,但还没 git add
Untracked files:
src/NewComponent.js ← 新文件,Git 还不知道它的存在

Terminal window
git add src/App.js # 添加指定文件
git add . # 添加当前目录下所有改动

一句话:选择哪些改动要包含在下一次提交里。

什么时候用:改完文件后、commit 之前。就像考试交卷前先检查一遍要交的答题卡。


Terminal window
git commit -m "添加用户登录功能"

一句话:把暂存区的内容保存为一个版本,附上一条说明。

什么时候用:完成一个小功能、修复一个 bug、或者做到一个可以”存档”的节点。

好的 commit 信息应该说清楚”做了什么”,比如 "修复登录页面密码校验bug" 而不是 "改了点东西"


Terminal window
git push

一句话:把本地仓库的提交上传到远程仓库(GitHub)。

什么时候用:commit 之后,想把代码同步到 GitHub 的时候。推送后别人就能看到你的更新了。


Terminal window
git pull

一句话:把远程仓库的最新内容下载到本地并合并。

什么时候用:开始工作前,先拉取一下,确保你的代码是最新的。就像开工前先看看有没有新的通知。


Terminal window
# 日常操作流程
git pull # 1. 先拉取最新代码
# ...编辑文件...
git status # 2. 看看改了什么
git add . # 3. 把改动放进暂存区
git commit -m "完成了XX功能" # 4. 提交一个版本
git push # 5. 推送到 GitHub

想象你正在玩一个 RPG 游戏,主线剧情推到了第五章。你想试试一个冒险的决定,但又怕搞砸主线。怎么办?开一个新存档槽,在那里随便折腾,成功了再把结果搬回主线。

这就是 Git 分支的作用。

main ●───●───●───●───●───● ← 主线(稳定版本)
\ /
feature ●───●───● ← 支线(试验新功能)
Terminal window
git branch feature-login # 创建一个叫 feature-login 的分支
git switch feature-login # 切换到这个分支
# ...在分支上开发...
git switch main # 切换回主线
git merge feature-login # 把分支的成果合并到主线

git checkout 分支名 也能切换分支,效果和 git switch 一样。你在网上会看到两种写法,都对。

什么时候用分支?

  • 要开发一个新功能,但不想影响当前能用的版本
  • 要尝试一个不确定的方案
  • 多人协作,每人在自己的分支上开发

不是所有文件都应该上传到 GitHub。项目根目录下有一个叫 .gitignore 的文件,列在里面的文件会被 Git 忽略。

# .gitignore 示例
node_modules/ # 依赖包,太大了(几百 MB),别人 npm install 就能重新生成
.env # 环境变量,里面有密钥、密码等敏感信息
dist/ # 编译产物,可以从源码重新生成
.DS_Store # macOS 系统文件,没用

为什么要忽略这些?

文件原因
node_modules/体积巨大,从 package.json 就能重新安装
.env包含密钥和密码,上传到 GitHub 等于公开你的密码
编译产物 (dist/, build/)可以从源码重新生成,没必要存

出了问题不要慌,下面是最常见的”后悔药”:

场景命令说明
改了文件但还没 add,想撤销git checkout -- 文件名把文件恢复到上次 commit 的状态
已经 add 了,想从暂存区撤回git reset HEAD 文件名文件回到”已修改但未暂存”状态,改动不会丢
已经 commit 了,想撤回git reset HEAD~1撤销最近一次 commit,改动保留在工作区
commit 信息写错了git commit --amend -m "新信息"修改最近一次 commit 的信息
想看历史提交记录git log --oneline查看简洁的提交历史

提示:HEAD 表示”当前最新的 commit”,HEAD~1 表示”上一个 commit”。


现在就动手试一试,整个过程不超过 5 分钟:

  1. 在 GitHub 上点右上角 ”+“,选 “New repository”,创建一个新仓库(名字随便起,比如 git-practice
  2. 复制仓库的 HTTPS 地址,在终端执行:
    Terminal window
    git clone https://github.com/你的用户名/git-practice.git
    cd git-practice
  3. 创建一个文件并提交:
    Terminal window
    echo "Hello Git!" > hello.txt
    git add hello.txt
    git commit -m "我的第一次提交"
    git push
  4. 回到 GitHub 页面刷新,你应该能看到 hello.txt 文件出现了

恭喜,你已经完成了一次完整的 Git 工作流:创建 → 暂存 → 提交 → 推送。


命令作用记忆口诀
git clone <url>下载项目到本地第一次拿代码
git status查看当前状态低头看仪表盘
git add <file>放进暂存区选好要交的答题卡
git commit -m "描述"提交一个版本存档
git push推送到 GitHub备份到云端
git pull拉取最新代码开工前先同步

你不需要记住所有命令。 日常开发中,Claude Code 会帮你执行大部分 Git 操作。但你需要:

  1. 看懂它在做什么(commit 了什么、push 到哪里)
  2. 出问题时知道怎么回退
  3. 理解分支的概念,因为团队协作会用到

下一步:回到主线,开始动手构建你的第一个项目。