速查 03 · Git
按问题索引("我遇到 X 怎么办")。 规范见提交约定,原理见文末链接。
目录
撤销与回退
| 我想… | 命令 |
|---|---|
| 撤销工作区某文件的修改(未 add) | git checkout -- <file> 或 git restore <file> |
| 撤销已 add 但未 commit | git restore --staged <file> |
| 撤销最后一次 commit,改动保留在工作区 | git reset --soft HEAD~1 |
| 撤销最后一次 commit,改动也丢弃 | git reset --hard HEAD~1 ⚠️ 不可恢复 |
| 修改最后一次提交的信息 | git commit --amend -m "新信息" |
| 往最后一次提交补文件 | git add <file> && git commit --amend --no-edit |
| 回退某次提交但保留历史(生成新提交) | git revert <commit> ✅ 已推送时用这个 |
| 回退到指定版本(丢弃之后所有) | git reset --hard <commit> ⚠️ 未推送才用 |
⚠️ 已推送到远端的提交,用
revert不要reset——reset后强推会覆盖他人历史。
暂存与切换
bash
git stash # 暂存当前改动(工作区变干净)
git stash push -m "说明" # 带说明(推荐)
git stash list # 查看暂存列表
git stash pop # 恢复最近一次并删除
git stash apply stash@{0} # 恢复指定项但保留在列表
git stash drop stash@{0} # 删除指定项
git stash clear # 清空(谨慎)
git stash -u # 连未跟踪文件一起暂存典型场景:改到一半要切分支 → git stash push -m "xxx" → 切分支 → 回来 git stash pop。
分支操作
bash
git branch # 查看本地分支
git branch -a # 查看所有(含远端)
git checkout -b feat/xxx # 新建并切换
git switch -c feat/xxx # 同上(新写法)
git checkout dev # 切换分支
git branch -d feat/xxx # 删除已合并分支
git branch -D feat/xxx # 强制删除未合并分支
git push origin --delete feat/xxx # 删除远端分支
git branch -m old new # 重命名当前分支
git push origin dev # 推送到远端
git push -u origin feat/xxx # 首次推送并建立追踪
git pull # 拉取并合并
git pull --rebase # 拉取并变基(保持线性历史,推荐)变基与合并
bash
git merge dev # 把 dev 合入当前分支(保留分叉历史)
git rebase dev # 把当前分支接到 dev 之后(线性历史)
# 交互式变基:整理本地未推送的提交
git rebase -i HEAD~3 # 处理最近 3 次提交
# pick 保留
# squash 合并到上一个(s)
# reword 改提交信息(r)
# drop 删除(d)
git rebase --continue # 解决冲突后继续
git rebase --abort # 放弃变基,回到原状态
git cherry-pick <commit> # 把某次提交摘到当前分支⚠️ 只对未推送的提交做 rebase。已推送的提交变基后需要强推,会覆盖远端历史。
查看与排查
bash
git status # 当前状态
git status -s # 简洁版
git log --oneline -10 # 最近 10 条(一行)
git log --oneline --graph # 带分支图
git log -p <file> # 某文件的修改历史
git log --author="名字" # 按作者过滤
git log -S "关键词" # 搜索包含某词的提交(找"这行谁改的")
git diff # 工作区 vs 暂存区
git diff --staged # 暂存区 vs HEAD
git diff HEAD~1 # 与上一次提交对比
git diff dev..master # 两个分支对比
git show <commit> # 看某次提交内容
git show <commit>:<file> # 看某版本的文件内容
git blame <file> # 逐行看最后修改者
git reflog # ⭐ 所有操作记录(误操作救命用)救急场景
| 场景 | 解法 |
|---|---|
误 reset --hard 找不回提交 | git reflog 找到 commit → git reset --hard <commit> |
| 误删分支 | git reflog 找到该分支最后的 commit → git checkout -b 分支名 <commit> |
| 提交到了错误分支 | git reset --soft HEAD~1 → git stash → 切到正确分支 → git stash pop → 重新提交 |
| 提交信息写错(未推送) | git commit --amend -m "正确信息" |
| 提交信息乱码 | 编码问题,见下方中文乱码 |
| 合并冲突 | 编辑冲突文件(搜 <<<<<<<)→ git add → git commit(merge)或 git rebase --continue |
| 想放弃本地所有改动 | git checkout . && git clean -fd ⚠️ 会删未跟踪文件 |
| node_modules 等被误提交 | 加 .gitignore 后 git rm -r --cached <dir>(.gitignore 对已跟踪文件无效) |
| 工作区有改动但要拉代码 | git stash → git pull → git stash pop |
| 推送被拒(远端有更新) | git pull --rebase → 解决冲突 → git push |
中文乱码
Windows PowerShell 以 GBK 编码提交中文会乱码(如 瀵艰埗)。用 Git Bash 提交可根除:
bash
# 单行
git commit -m "feat: 新增功能"
# 多行(用 heredoc)
git commit -m "$(cat <<'EOF'
feat: 新增功能
补充说明
EOF
)"PowerShell 若必须用,先切代码页:chcp 65001。
提交规范
本项目采用 Conventional Commits 英文 type + 中文描述:
<type>(<scope>): <中文简述>| type | 用途 |
|---|---|
feat | 新功能 / 新增文档 |
fix | 修复 |
docs | 文档改动 |
refactor | 重构(不改行为) |
perf | 性能优化 |
test | 测试 |
chore | 构建/依赖/杂项 |
style | 格式(空格、分号等) |
示例:
feat(nav): 新增 Flutter 全部文档下拉导航
fix(deploy): 添加 --branch main 确保部署到生产环境
docs(readme): 修正过时的部署说明规则:
- 按需
git add <相关文件>,不用git add -A(避免误带日志与依赖) - 复杂改动在 subject 后空一行,补 1~3 行中文正文说明原因
- 提交≠部署:站点部署需验证后单独执行
完整流程封装在
git-commitskill 中(用户级~/.codebuddy/skills/git-commit/)。
配置(一次性)
bash
git config --global user.name "你的名字"
git config --global user.email "你的邮箱"
git config --global core.autocrlf input # 避免换行符污染(Windows 建议)
git config --global core.quotepath false # 让中文路径正常显示
git config --global alias.lg "log --oneline --graph --all" # 常用别名.gitignore 要点
gitignore
node_modules/
.vitepress/dist/
.vitepress/cache/
*.log
.DS_Store
# 凭据绝不入库
*.token
.env
key.properties # Android 签名配置⚠️
.gitignore只对未跟踪文件生效。已被跟踪的文件要先git rm --cached <file>再提交。