基础的 add/commit/push 只能满足日常协作,掌握进阶命令能精确控制版本历史、高效排查问题。
Interactive Rebase 整理历史
通过 reword/squash/fixup/drop 指令重写提交序列,合并 WIP 提交、修正信息、删除调试代码,保持主分支提交历史清晰可读。
#!/usr/bin/env bash
set -euo pipefail
# 1. Interactive Rebase: squash最近5条WIP,reword命名
git rebase -i HEAD~5 <<EOF
pick a1b2c3d feat: add login API
reword b3e4f5g fix typo in user model
squash c6h7i8j wip: add test cases
fixup d9k0l1m fix lint issues
drop e2n3o4p tmp debug log
EOF
# 2. Cherry-pick: 跨分支移植hotfix
git checkout release/2.0
git cherry-pick -x a1b2c3d
# 多个提交合入暂存区手动合并后一次性提交:
# git cherry-pick --no-commit b3e4f5g c6h7i8j
# git cherry-pick --continue / --abort
# 3. Bisect: 二分找引入Bug的提交
git bisect start
git bisect bad HEAD
git bisect good v1.8.0
git bisect run pytest tests/test_auth.py -x
# Output: a1b2c3d is the first bad commit
git bisect reset
# 4. Reflog救援
git reflog --date=iso | head -20
# git reset --hard HEAD@{3}
# 5. 批量修复作者信息
git filter-branch -f --env-filter '
if [ "$GIT_AUTHOR_EMAIL" = "old@example.com" ]; then
export GIT_AUTHOR_NAME="Correct Name" GIT_AUTHOR_EMAIL="new@example.com"
export GIT_COMMITTER_NAME="$GIT_AUTHOR_NAME" GIT_COMMITTER_EMAIL="$GIT_AUTHOR_EMAIL"
fi
' HEAD
Bisect 二分查 Bug
当回归 Bug 不知何时引入时,Bisect 通过二分搜索自动找出首个坏提交。配合自动化测试脚本可零人工介入,几分钟定位问题。
| 命令 | 作用 | 风险级别 | 推荐场景 |
|---|---|---|---|
| rebase -i | 重写历史 | 中(只改未推送分支) | 提交整理/MR前 |
| cherry-pick | 移植提交 | 低(产生新hash) | 回移hotfix |
| bisect | 二分查Bug | 极低(只读) | 回归Bug定位 |
| reflog | 操作历史 | 零(只读) | 误操作救援 |
| filter-branch | 批量改写 | 极高(改所有hash) | 作者信息修复 |
最佳实践
黄金原则:永远不要 rebase 已经推送到公共分支的提交。危险操作前先打 git tag backup-$(date +%Y%m%d) 保险标签。