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,即可在提交前自动执行。

团队级别可借助 Huskylefthook 将钩子脚本纳入版本控制。

Git Credential 与安全

  • 使用 git credential-managergit-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> 查阅更多参数,保持指令熟练度。