Skip to content

速查 03 · Git ​

按问题索引("我遇到 X 怎么办")。 规范见提交约定,原理见文末链接。

目录 ​


撤销与回退 ​

我想…命令
撤销工作区某文件的修改(未 add)git checkout -- <file> 或 git restore <file>
撤销已 add 但未 commitgit 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-commit skill 中(用户级 ~/.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> 再提交。


相关:返回速查区 | 踩坑记录