Git 高级用法
交互式 Rebase
交互式 rebase 是整理提交历史最强大的工具。
基本用法
# 整理最近 3 个提交
git rebase -i HEAD~3
# 从特定分支分叉点开始整理
git rebase -i main
在交互式编辑器中,每个提交前可以选择操作:
pick abc123 feat: add user login # 保留该提交
reword def456 fix: update timeout # 修改提交信息
squash 789ghi chore: typo fix # 合并到前一个提交
fixup 012jkl chore: minor # 合并且丢弃提交信息
drop 345mno WIP # 删除该提交
edit 678pqr refactor: extract util # 在此提交处暂停以修改
实用场景
# 将 WIP 提交压缩为一个正式提交
git rebase -i HEAD~5
# 将所有 WIP 标记为 squash
# 修改特定历史提交的信息
git rebase -i --root # 修改根提交
git rebase -i HEAD~10 # 重新编辑某个提交信息
# 拆分一个提交为多个
# 在交互式界面中标记该提交为 edit
git reset HEAD^ # 取消暂存
git add -p # 交互式分段暂存
git commit -m "part 1"
git add ...
git commit -m "part 2"
git rebase --continue
Git Bisect
二分查找快速定位引入 bug 的提交。
# 开始二分查找
git bisect start
git bisect bad # 当前版本有 bug
git bisect good v1.0 # v1.0 是好的
# Git 会检出中间提交,测试后标记
git bisect good # 或 bad
# 重复直到找到第一个 bad 提交
# 自动化执行
git bisect start HEAD v1.0
git bisect run npm test # 用测试命令自动判断
git bisect reset # 结束后回到 HEAD
Submodule 管理
基本操作
# 添加子模块
git submodule add https://github.com/example/lib.git libs/mylib
# 克隆包含子模块的项目
git clone --recurse-submodules <repo-url>
# 更新子模块到最新提交
git submodule update --remote libs/mylib
最佳实践
# 跟踪子模块的特定分支
git -C libs/mylib checkout main
git add libs/mylib
git commit -m "chore: update mylib to latest main"
# 子模块递归操作
git submodule foreach 'git checkout main && git pull'
高级合并策略
解决冲突
# 使用 merge-tool
git mergetool
# 以一方为准
git merge -X theirs feature-branch # 冲突时使用他们的
git merge -X ours feature-branch # 冲突时使用我们的
# 查看冲突文件
git diff --name-only --diff-filter=U
git status | grep "both modified"
Cherry-pick
# 挑选特定的提交到当前分支
git cherry-pick abc123 def456
# 不自动提交
git cherry-pick -n abc123
# 挑选一个范围的提交
git cherry-pick abc123..def789
Reflog
当操作失误时,reflog 是最后的救星。
# 查看所有 HEAD 移动记录
git reflog
# 恢复误删的提交
git reflog # 找到删除前的 SHA
git checkout <sha>
git branch recover-branch
# 恢复 rebase 之前的状態
git reflog # 找到 rebase 前的 sha
git reset --hard HEAD@{2} # 或者直接使用引用
Stash 进阶
# 带名称的暂存
git stash push -m "WIP: refactoring auth module"
# 仅暂存未跟踪的文件
git stash -u
# 查看暂存列表
git stash list
# 应用特定暂存
git stash apply stash@{2}
# 从暂存中创建分支
git stash branch feature/new-branch stash@{0}
Worktree
在同一个仓库中同时检出多个分支。
# 为 hotfix 创建新的工作目录
git worktree add ../hotfix-folder hotfix-branch
# 为特性分支创建工作目录
git worktree add -b new-feature ../new-feature main
# 列出所有 worktree
git worktree list
# 移除 worktree
git worktree remove ../hotfix-folder
配置与别名
# 常用别名
git config --global alias.lg "log --graph --oneline --all --decorate"
git config --global alias.ci "commit"
git config --global alias.co "checkout"
git config --global alias.st "status -sb"
git config --global alias.unstage "reset HEAD --"
git config --global alias.last "log -1 HEAD"
# 功能分支工作流别名
git config --global alias.prune-branches "!git branch --merged | grep -v \"\*\|main\|master\" | xargs -n 1 git branch -d"
总结
掌握 Git 高级用法能让你从"用 Git 保存代码"进化到"用 Git 管理项目历史"。交互式 rebase 保持提交历史整洁,bisect 快速定位问题,reflog 提供安全网。在日常工作中善用这些工具,可以显著提升团队协作效率和代码质量。