ToolkitX
知识库工具箱

Git 常用命令

add, commit, push, pull, fetch 详解

20min·入门

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 分支管理

下一节