01. Git 工作区、暂存区、本地仓库
Git 最核心的三个概念搞懂了操作就通透了:
工作区——你电脑上能看到、能编辑的文件目录。git clone 下来或者 init 出来的就是工作区。
暂存区——一个中间地带,决定哪些修改纳入下次 commit。用 git add 把文件从工作区放进暂存区。你可以只 add 部分文件的修改,不想要的先留着下次再 commit。
本地仓库——git commit 之后,暂存区的快照永久保存在本地仓库里(.git 目录)。commit 就是给当前快照打个版本标签。
还有远程仓库——github/gitlab 上的那个。git push 把本地的 commit 推上去,git pull 把远程的拉下来。
这个流程简记:工作区改文件 → git add 到暂存区 → git commit 到本地仓库 → git push 到远程仓库。
bash
# 完整的工作流
git status # 看看改了啥
git diff # 看看具体改了啥内容
git add file.txt # 把改动加入暂存区
git add . # 加所有改动
git diff --staged # 看看暂存区里有什么
git commit -m "msg" # 提交到本地仓库
git push origin main # 推到远程仓库git status 告诉你哪个区有改动;git diff 看工作区 vs 暂存区的差异;git diff --staged 看暂存区 vs 上次 commit 的差异。
02. commit、log、show——提交与查看历史
commit 是 Git 的核心操作——给当前暂存区打个快照保存到仓库。每个 commit 有个唯一的 SHA-1 hash(40 位十六进制)。
git log 看提交历史,按时间从新到老排列。参数很多:--oneline(一行一条简洁)、--graph(画分支图)、--all(所有分支)、--author="名字"(按作者筛选)、--since/--until(按日期筛选)。
git show 看某个 commit 的详细内容——改了哪些文件、具体改了哪几行。可以看当前 HEAD 也可以看任意 commit hash。
git blame 看某个文件每一行是谁写的、在哪次 commit 改的——找到罪魁祸首的利器。
bash
# 提交
git commit -m "feat: add user login"
git commit -am "fix: typo" # add + commit 一步(只对已跟踪的文件有效)
# 查看历史
git log --oneline --graph --all
git log --author="Alice" --since="2024-01-01"
git log -p file.txt # 看某个文件的修改历史
# 查看详情
git show HEAD
git show abc1234 # 看某个 commit
git blame package.json # 谁改了这行commit message 规范推荐 Conventional Commits:feat:(新功能)、fix:(修 bug)、docs:(文档)、refactor:(重构)。
03. diff——文件差异对比
git diff 是看文件改了什么的行家工具。不同参数看不同区域的差异:
git diff(不加参数)——工作区跟暂存区的差异。你改了但还没 add 的内容。
git diff --staged——暂存区跟上次 commit 的差异。你 add 了但还没 commit 的内容。
git diff HEAD——工作区跟上次 commit 的差异(包含暂存和未暂存的改动)。
git diff branch1..branch2——两个分支之间的差异。
git diff commit1 commit2——两个提交之间的差异。
bash
# 各种 diff
git diff # 工作区 vs 暂存区
git diff --staged # 暂存区 vs HEAD
git diff HEAD # 工作区 vs HEAD
git diff main..feature # 两个分支的差异
git diff abc1234 def5678 # 两个 commit 的差异
git diff --stat # 只看改动统计(哪些文件改了几行)
git diff --name-only # 只列改动的文件名git diff --name-only 配合 xargs 可以做批量操作——比如查出所有改动的 .js 文件然后只对他们跑 lint。
04. amend、reset、restore——修改与撤销
改错了怎么撤销?Git 提供了多个命令,按不同阶段用不同方法:
撤销工作区的改动——git restore file.txt 把工作区的文件恢复到暂存区版本(或恢复到最后一次 commit)。
撤销暂存区的改动——git restore --staged file.txt 把文件从暂存区移出(add 的逆操作)。
修改最近一次 commit——git commit --amend 把暂存区的内容追加到上一次 commit。可以改 message、补漏加文件。但不要 amend 已经 push 了的 commit(会改变 hash,别人没法同步)。
撤销 commit——git reset --soft HEAD~1 撤销 commit 但保留改动在暂存区;git reset --mixed HEAD~1 撤销 commit 且取消暂存但保留文件改动;git reset --hard HEAD~1 彻底回到上一个 commit(改动的文件丢光)。
bash
# 撤销工作区修改
git restore file.txt
git restore . # 撤销所有文件
# 撤销暂存区
git restore --staged file.txt
# 修改最近一次 commit
git add forgotten.txt
git commit --amend -m "new msg"
# 撤销 commit
git reset --soft HEAD~1 # 保留改动在暂存区
git reset --mixed HEAD~1 # 保留改动在工作区(未暂存)
git reset --hard HEAD~1 # 彻底删掉(不可恢复!)git reset --hard 没有后悔药!执行前确认你知道自己在干什么。已经在 commit 里的东西可以通过 reflog 恢复,但 uncommitted 的改动真没了。
05. tag——给版本打标签
tag 是给某个 commit 打上一个有意义的标签,通常用来标记发布版本(v1.0.0、v2.1.3)。
轻量标签(Lightweight Tag)——只是指向某个 commit 的引用,没有额外信息。
注释标签(Annotated Tag)——完整的 Git 对象,包含标签人、日期、备注消息。git tag -a 创建的就是注释标签,推荐用这种。
git push 默认不会推送标签到远程,需要 git push --tags 或 git push origin v1.0.0。
git tag -l 列出所有标签。git show v1.0.0 看标签详情(包括它指向的 commit 信息)。
git checkout v1.0.0 可以把工作区切换到标签对应的代码状态(但会进入 detached HEAD 状态)。
bash
# 创建标签
git tag v1.0.0 # 轻量标签
git tag -a v1.0.0 -m "正式发布 1.0" # 注释标签(推荐)
# 给过去的 commit 打标签
git tag -a v0.9.0 abc1234 -m "0.9 beta"
# 推送标签
git push origin v1.0.0 # 推单个标签
git push origin --tags # 推所有标签
# 查看/删除
git tag -l # 列出所有标签
git show v1.0.0 # 看标签详情
git tag -d v1.0.0 # 删除本地标签
git push origin --delete v1.0.0 # 删除远程标签语义化版本号(SemVer)格式是 主版本.次版本.修订号(如 2.1.3)。主版本变化表示不兼容的 API 修改。
知识测验
第 1/5 题正确 0
git add 把文件从哪移到哪?
下一节
下一节 Git 分支管理