三、Git 基础操作:日常开发的 80%
3.1 初始化仓库
# 方式1:从零开始创建新仓库
mkdir my-project
cd my-project
git init
# Initialized empty Git repository in /path/to/my-project/.git/
# 方式2:克隆现有远程仓库
git clone https://github.com/username/repo.git
git clone git@github.com:username/repo.git # SSH 方式
git clone https://github.com/username/repo.git my-folder # 指定文件夹名
3.2 查看状态与差异
# 查看工作区和暂存区状态(最常用的命令)
git status
# 详细状态
git status -s # 简短输出
# ?? 新文件(未追踪)
# A 已暂存(新添加)
# M 已修改
# D 已删除
# 查看具体修改内容
git diff # 工作区 vs 暂存区
git diff --staged # 暂存区 vs 上一次提交
git diff HEAD # 工作区 vs 上一次提交
git diff <commit1> <commit2> # 两个提交之间的差异
# 查看特定文件的差异
git diff src/index.js
3.3 添加与提交
# 添加文件到暂存区
git add README.md # 添加单个文件
git add src/ # 添加整个目录
git add . # 添加当前目录下所有修改(谨慎使用)
git add -A # 添加所有修改(包括删除和新增)
# 交互式添加(选择部分修改)
git add -p # 可以逐块选择是否暂存
# 提交到本地仓库
git commit -m "添加登录功能"
# 提交并跳过暂存区(直接提交工作区的修改)
git commit -a -m "修复Bug"
# 修改最后一次提交(修改提交信息或补充遗漏文件)
git commit --amend -m "新的提交信息"
# 补充文件到上一次提交(不修改信息)
git add forgotten-file.js
git commit --amend --no-edit
3.4 查看历史
# 查看提交历史
git log
# 单行显示
git log --oneline
# 图形化显示分支结构
git log --oneline --graph --all
# 显示最近 N 次提交
git log -5
# 显示每次提交的修改内容
git log -p
# 按作者筛选
git log --author="张三"
# 按时间筛选
git log --since="2024-01-01" --until="2024-12-31"
# 按提交信息筛选
git log --grep="修复"
# 查看某文件的提交历史
git log --follow src/index.js
# 查看是谁最后修改了文件的每一行
git blame src/index.js
3.5 撤销操作
# 1. 撤销工作区的修改(还没 add)
git checkout -- <file> # 恢复到上次提交的状态
git restore <file> # 新版本的写法(推荐)
# 2. 撤销暂存区的修改(已经 add,还没 commit)
git reset HEAD <file> # 旧版本写法
git restore --staged <file> # 新版本写法(推荐)
# 3. 撤销提交(已经 commit,还没 push)
git reset --soft HEAD~1 # 撤销提交,保留修改在工作区
git reset --mixed HEAD~1 # 撤销提交和暂存,保留修改在工作区(默认)
git reset --hard HEAD~1 # 完全撤销,丢失所有修改(危险!)
# 4. 撤销远程提交(已经 push,需要谨慎!)
git revert HEAD # 创建一个新的提交来撤销上一次提交
git revert <commit-hash> # 撤销指定的提交
# 5. 恢复被删除的文件
# 先找到删除该文件的提交
git log --diff-filter=D --summary | grep delete
# 然后恢复
git checkout <commit-hash>^ -- <file-path>
reset vs revert 的区别:
reset:移动 HEAD 指针,改写历史
A → B → C (HEAD)
git reset HEAD~1
A → B (HEAD) # C 消失了
revert:保留历史,创建新提交来撤销
A → B → C → C' (HEAD)
git revert HEAD
A → B → C → D (D = 撤销 C 的修改)