前言

git 是现在做项目、写代码绕不开的版本管理工具,也是把博客推到 GitHub、再部署到 Vercel 的基础。前面几篇博客里其实一直在用 git,但从来没系统地整理过。好记性不如烂笔头,很多命令记着用用就忘了,于是决定写一篇文章,把 git 从安装到日常使用、再到远程协作的完整流程记录下来。

本文以 Linux / macOS 的命令行为主,Windows 下安装 Git 后在 Git Bash 里操作即可,命令基本一致。
文章里会尽量把「为什么这么做」也写出来,方便之后忘记时回来一看就懂。

安装与配置

安装

  • Linux:用包管理器装,比如 sudo apt install git 或 sudo dnf install git。
  • macOS:可以直接 brew install git,或者装 Xcode Command Line Tools。
  • Windows:去 git 官网 下载安装包,一路下一步,装完会自带 Git Bash,后面的命令都在里面跑。

装完验证一下:

1
2
git --version
# git version 2.43.0

能输出版本号就说明装好了。

配置个人信息

commit 的时候 git 会记录是谁提交的,所以要先配好:

1
2
3
4
5
6
# 全局配置(所有仓库通用)
git config --global user.name "Elyrene"
git config --global user.email "you@example.com"

# 查看配置
git config --list

建议 user.name 和 user.email 用你在 GitHub 上的昵称和邮箱,这样提交的头像和归属才能对上。

基本概念

在写命令之前,先搞懂 git 的三块区域,很多操作都是在它们之间搬文件:

区域 说明
工作区 你正在编辑的文件夹,也就是项目本身
暂存区(stage) 用 git add 把文件「标记」后放到的地方
仓库(.git) 真正存提交历史的地方,git commit 把暂存区写进去

简单记:工作区 → add → 暂存区 → commit → 仓库 → push → 远程仓库。

初始化仓库

在一个空文件夹里初始化一个新仓库:

1
2
mkdir my-blog && cd my-blog
git init

git init 会创建隐藏的 .git 目录,所有版本历史都存这里。

忽略不该提交的文件

.gitignore 文件里写的是「不要提交」的路径,一行一个,支持 * 通配符。Hexo 博客项目一般这样写:

1
2
3
4
5
6
7
8
# 依赖
node_modules/

# 生成的静态文件
public/

# 缓存
db.json

.gitignore 本身是要提交的,它决定了整个团队统一的忽略规则。
注意:已经被 git 跟踪过的文件,写进 .gitignore 是没用的,得先 git rm --cached <文件> 再忽略。

日常操作

查看状态

1
2
3
git status          # 看哪些文件改了、哪些还没跟踪
git diff # 看工作区相对暂存区的具体改动
git diff --staged # 看暂存区相对上一次提交的改动

git status 是日常最高频的命令之一,提交前扫一眼总没错。

添加文件到暂存区

1
2
3
4
git add file.md     # 添加单个文件
git add . # 添加当前目录所有改动(谨慎)
git add -A # 添加所有改动,包括删除
git reset file.md # 把已添加的文件撤回到工作区

提交

1
git commit -m "feat: 添加 git 使用指南"

提交信息建议遵循 类型: 描述 的格式,方便以后看历史:

类型 含义
feat 新功能
fix 修 bug
docs 文档改动
style 格式调整
refactor 重构
chore 构建、依赖等杂项

查看历史

1
2
3
4
git log                     # 完整提交历史
git log --oneline # 每行一条,最常用
git log --oneline --graph # 带分支图
git show <commit-id> # 看某次提交的具体改动

撤销与回退

这部分是新手最容易慌的地方,其实场景就几种:

撤销工作区的修改(还没 add)

1
2
git checkout -- file.md    # 丢弃工作区对某文件的改动
git checkout -- . # 丢弃所有改动

撤销暂存(add 了但还没 commit)

1
2
git reset file.md          # 文件回到工作区(内容还在)
git reset --hard # 彻底丢弃,连工作区一起清空

回退提交(已经 commit 了)

1
2
3
git reset --hard <commit-id>    # 回到指定提交,之后的提交丢弃
git reset --soft <commit-id> # 回到指定提交,但改动保留在暂存区
git revert <commit-id> # 生成一个新提交,用来「抵消」某次提交(推荐,不改历史)

已经 push 到远程的提交,不要用 reset 改历史,用 revert 生成反向提交更安全,不会影响别人的本地仓库。

分支

git 的分支是「指向某个提交的指针」,创建和切换都很轻量:

1
2
3
4
5
6
git branch                  # 列出本地分支
git branch feat/git-guide # 创建分支
git switch feat/git-guide # 切换分支(老版本用 git checkout -b / git checkout)
git merge feat/git-guide # 在 master 上合并该分支
git switch -c feat/x # 创建并切换到 feat/x
git branch -d feat/git-guide # 删除已合并的分支

习惯:平时在 main/master 上不开工,先切个功能分支,做完合并回来。

远程仓库

关联远程

1
2
3
4
5
6
7
8
# 查看已关联的远程仓库
git remote -v

# 关联一个新的远程(origin 是默认别名)
git remote add origin https://github.com/Elyrene/my-blog.git

# 把本地提交推到远程
git push -u origin main

-u 会设置上游追踪,之后直接 git push / git pull 就行,不用每次都写全。

拉取与克隆

1
2
3
git pull                    # 拉取远程最新并合并(= fetch + merge)
git fetch # 只拉取不合并
git clone <仓库地址> # 克隆一个远程仓库到本地

完整流程速查

把一个本地项目首次推到 GitHub:

1
2
3
4
5
6
git init
git add .
git commit -m "init: 初始化项目"
git remote add origin https://github.com/Elyrene/my-blog.git
git branch -M main
git push -u origin main

实用技巧

查看最近改动

1
2
git log --oneline -5        # 最近 5 条提交
git blame file.md # 看某文件每行是谁、哪次提交改的

保存未完成的工作(stash)

切分支前手头改了一半不想提交,可以先藏起来:

1
2
3
git stash           # 暂存当前改动
git stash list # 查看暂存列表
git stash pop # 恢复最近一次暂存

查看大文件 / 二进制改动

1
git diff --stat         # 只看改动的统计信息

快捷打包项目

1
2
# Example.zip 是文件名(最好加上.zip),head 是 commit id
git archive --format=zip --output=Example.zip head

常见问题

修改了已经跟踪的文件后,.gitignore 不生效?

.gitignore 只对未被跟踪的文件有效。文件已经进过仓库了,写进忽略文件也不会自动忽略,需要:

1
git rm --cached <文件>   # 从仓库移除但保留本地文件

推送被拒绝(rejected, non-fast-forward)?

通常是远程有你本地没有的提交,先 git pull(或 git pull --rebase)合并后再推:

1
2
git pull --rebase origin main
git push

不小心把大文件提交进去了?

如果还没推送,用 git rm --cached 移除并加进 .gitignore;如果已经推送,历史里已经有这个文件了,需要用 git filter-repo 之类的工具清理历史。

小结

把最常用的命令记下来:init 建仓库、add + commit 保存进度、status / log 看状态和历史、branch / switch 管分支、push / pull 同步远程。理解了「工作区 → 暂存区 → 仓库 → 远程」这条线,大部分操作都能自己推导出来。

写博客、部署项目、协作开发,git 都是地基。先把这几个命令用熟,后面再学 rebase、cherry-pick 这些高级操作就不难了。

注:本篇文章大部分由 AI 生成。