0. 核心概念:Git 的三个空间

理解这三个地方,你就懂了 Git 的一半:

  1. 工作区 (Working Directory):你现在的文件夹,你正在写代码、改 Markdown 的地方。
  2. 暂存区 (Staging Area)“购物车”。你把想提交的文件先放进来 (git add),准备结账。
  3. 仓库 (Repository)“历史存档”。提交后 (git commit),文件就被永久记录在 .git 文件夹里了。

1. 常用配置 (一次性设置)

虽然你配过了,但备忘一下:

# 设置名字和邮箱 (这是你的身份证)
git config --global user.name "Chow Ray"
git config --global user.email "[email protected]"

# [你的特殊配置] 强制使用 GPG 签名
git config --global user.signingkey <你的KeyID>!
git config --global commit.gpgsign true

# [你的特殊配置] 指定 GPG 程序路径 (Windows)
git config --global gpg.program "E:\Program Files (x86)\GnuPG\bin\gpg.exe"

2. 日常博客更新 (快乐路径)

这是你 deploy.sh 脚本背后的逻辑:

查看状态 (GPS 导航)

不知道现在改了啥?有些啥文件变了?

git status
  • 红色:文件改了,还没进购物车。
  • 绿色:文件进购物车了,还没提交。

添加文件 (放入购物车)

# 添加所有变化 (最常用)
git add . 
# 或者
git add -A

# 只添加某个特定文件
git add content/posts/my-post.md

提交存档 (结账)

# -m 后面跟的是说明信息
git commit -m "新增了一篇关于 Git 的文章"

# [你的特殊用法] 带 GPG 签名 (如果你全局没开自动签名)
git commit -S -m "带签名的提交"

推送到服务器 (上传)

# 推送到远程仓库 (origin) 的主分支 (master)
git push origin master

拉取更新 (同步)

写博客前必做! 防止和手机端的修改冲突。

git pull origin master

3. 后悔药 (撤销与回滚)

这是新手最需要的救命药丸。

写错了,还没 add (撤销工作区的修改)

比如你把 config.yml 改乱了,想恢复成上次提交的样子:

git restore config.yml
# 或者旧写法: git checkout -- config.yml

add 错了,想拿出来 (撤出暂存区)

把文件放进购物车了,想拿出来,但不删除文件内容:

git restore --staged config.yml
# 或者旧写法: git reset HEAD config.yml

提交信息写错了,想改 (修补上一次提交)

刚 commit 完发现有错别字,或者少 add 了一个文件,不想多产生一条 commit 记录:

# 1. 修改文件并 git add (如果需要)
# 2. 运行修补命令
git commit --amend -m "这是修正后的提交信息"

彻底回滚 (时光倒流 - 危险 ⚠️)

放弃本地所有修改,强制回到远程仓库的状态(比如脚本跑崩了):

# 慎用!这会删除你所有未提交的稿子
git reset --hard origin/master

4. 纸片模组 (Submodules) 专用

因为你的 themes/PaperMod 是子模块,这块要专门讲。

第一次拉取带子模块的仓库

如果你换了新电脑,Clone 下来后发现主题文件夹是空的:

# 初始化并拉取子模块
git submodule update --init --recursive

升级 PaperMod 主题 (手动命令版)

如果你不想用小乌龟,想用命令行装 X:

# 1. 更新子模块到远程最新版
git submodule update --remote --merge

# 2. 回到根目录提交这个变化
git add themes/PaperMod
git commit -m "Update theme"

5. 极客查阅 (Log & Diff)

查看提交历史

# 简略版,一行一条,看得很爽
git log --oneline --graph --decorate

# [你的特殊用法] 查看 GPG 签名状态
git log --show-signature -1

查看具体改了什么

# 还没 add 的时候,查看改动
git diff

# 已经 add 了,查看将要提交的改动
git diff --staged

💡 常用命令速查表 (Cheat Sheet)

场景命令解释
开始工作前git pull从服务器拉取最新进度
看一眼情况git status现在的状态(红/绿)
保存进度git add .全部放入暂存区
确认保存git commit -m "xxx"提交生成版本号
上传云端git push发送到 GitHub
放弃修改git restore <文件>把文件恢复原状(慎用)
修改上次提交git commit --amend修正上一次的 Commit 信息
查看签名git log --show-signature检查 GPG 签名是否成功

🎁 git pull (拉取) 和 git fetch (获取) 有什么不同?

这是一个非常经典,也是最容易混淆的 Git 概念。

用一句工科男能秒懂的公式来解释:

git pull (拉取) = git fetch (获取) + git merge (合并)


1. 通俗易懂的“快递”比喻

想象你在网上买了一堆新书(GitHub 上的更新),寄到了你家楼下的智能快递柜(你本地的 .git 仓库隐藏目录)。

  • git fetch (获取)

    • 动作:你去快递柜看了一眼,确认“哦,货到了,有 3 本书”。
    • 结果:你知道有更新了,但书还在柜子里。你家书桌上(你的工作目录)还是原来的样子,没有任何变化。
    • 安全性100% 安全。无论 GitHub 上变成了什么样,都不会影响你正在写的代码。
  • git pull (拉取)

    • 动作:你把书从快递柜里拿出来,直接倒在你的书桌上,并且试图把你正在读的书替换掉。
    • 结果:你的工作目录直接变成了最新的样子。
    • 风险:如果你书桌上原本就摊着一本书(本地有修改),新书倒下来可能会把旧书压坏,或者混在一起(冲突 Conflict)。

2. 深度技术对比

维度Fetch (获取)Pull (拉取)
动作对象只更新 .git/ 数据库更新 .git/ + 当前工作文件
对代码的影响 (你的代码纹丝不动) (你的代码会变)
网络操作下载数据下载数据
是否可能冲突绝不可能 (如果两边都改了同一行)
适用场景看看别人改了啥,但不想合并确定没问题,同步最新进度

3. 在你的博客场景中

场景 A:日常写作(手机写完,电脑接着写)

  • 推荐git pull
  • 理由:你很清楚手机改了文章 A,电脑上还没动。直接 Pull 下来,接着写,效率最高。你的 deploy.sh 脚本里用的就是这个。

场景 B:解决冲突(手机改了 A,电脑也改了 A)

  • 推荐:先 git fetch
  • 理由
    1. 你运行 git pull 报错了,提示冲突。
    2. 这时运行 git fetch,把远程的变化下载到本地数据库(但不合并)。
    3. 然后你可以用 TortoiseGit 的“比较 (Diff)”功能,对比一下 origin/master (远程) 和 master (本地) 到底哪里不一样。
    4. 看清楚后,再决定怎么合并。

👨🏻‍⚖️ PM 的总结

  • Fetch“侦察兵”:只看不动,安全第一。
  • Pull“搬运工”:连搬带拆,简单粗暴。

对于个人博客,99% 的情况直接用 Pull 没问题;只有当你发现报错了,才需要用 Fetch 来进行“外科手术式”的排查。