Git 高级用法

2026-06-22 · 6 阅读 · 506字
Git

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 提供安全网。在日常工作中善用这些工具,可以显著提升团队协作效率和代码质量。