Rebase 与历史整理
交互式 rebase
用于梳理一组提交的顺序、合并或拆分:
git rebase -i HEAD~5
常见指令含义:
pick:保留提交reword:修改提交说明squash:将多条提交压缩为一条edit:暂停以修改内容
解决冲突后继续
git status # 查看冲突
git add <resolved-file>
git rebase --continue
git rebase --abort # 放弃本次 rebase
在公共分支谨慎使用
对已推送的分支执行 rebase 会改写历史。如果需要,对团队成员提前同步,并使用 git push --force-with-lease,减少误覆盖他人提交的风险。
变基 + 合并的组合拳
git pull --rebase:获取远程提交并把本地提交“平铺”在其后,减少无意义的合并节点。git rebase origin/master:在功能分支上更新 master 的最新代码。git merge --no-ff:保留合并节点,便于追踪特性分支的历史。
Bisect:二分定位缺陷
当某个时间段引入了 bug,可用 git bisect 快速锁定问题提交。
git bisect start
git bisect bad HEAD # 标记当前为坏提交
git bisect good v1.1.0 # 标记已知正常的版本
随后按提示运行测试:
<执行测试脚本>
# 测试通过则标记 good,失败标记 bad
git bisect good
git bisect bad
定位完成后重置状态:
git bisect reset
Worktree:多分支并行开发
git worktree 可在同一仓库目录下同时检出多个分支,避免重复 clone。
git worktree add ../repo-hotfix hotfix/20251010
- 新目录
../repo-hotfix会指向同一 Git 对象库。 - 完成后通过
git worktree list查看所有工作树。 - 不再需要时执行
git worktree remove ../repo-hotfix清理。
Stash 的更多玩法
- 只暂存指定路径:
git stash push -m "wip" -- src/service - 查看具体内容:
git stash show -p stash@{1} - 将 stash 导出为补丁:
git stash show -p > fix.patch
子模块与子仓库
当主项目依赖其他 Git 仓库时,可用 git submodule 管理:
git submodule add https://github.com/org/lib libs/lib
更新所有子模块:
git submodule update --init --recursive
迁移或删除子模块时记得同步清理 .gitmodules 与 .git/config 中的配置。
Sparse Checkout:只检出部分目录
大仓库中若只需要子目录,可启用稀疏检出:
git sparse-checkout init --cone
git sparse-checkout set services/api services/common
恢复完整检出:
git sparse-checkout disable
钩子(Hooks)与自动化
本地 .git/hooks 目录下的脚本可用于提交流程前自动执行校验。例如 pre-commit 钩子:
#!/bin/sh
npm run lint && npm test
把脚本放在 .git/hooks/pre-commit 并赋予执行权限 chmod +x .git/hooks/pre-commit,即可在提交前自动执行。
团队级别可借助 Husky 或 lefthook 将钩子脚本纳入版本控制。
Git Credential 与安全
- 使用
git credential-manager或git-credential-osxkeychain保存凭证。 - 访问 Token 失效时,执行
git credential reject清理缓存。 - 对共享服务器建议启用
SSH+config别名管理多个仓库。
多远程协作
一个仓库可同时指向多套远程:
git remote add upstream [email protected]:org/main.git
git remote add backup [email protected]:org/mirror.git
同步逻辑:
git fetch upstream
git merge upstream/master # 或 cherry-pick 指定提交
git push backup main # 推送到备用仓库
查看对象与存储结构
理解 Git 内部实现有助于排查疑难杂症:
git rev-list --count HEAD # 统计提交数量
git cat-file -p <object> # 查看对象内容
git fsck # 检查仓库完整性
结语
基础篇和进阶篇配合使用,可以覆盖从日常提交到复杂回溯的大部分需求。遇到特殊场景时,结合官方文档或 git help <command> 查阅更多参数,保持指令熟练度。