Skip to main content
Version: 3.0.1

Git 高级用法

本章将介绍 Git 的一些高级功能和技巧,帮助你更高效地使用 Git。

储藏(Stash)

临时保存修改

# 储藏当前修改
git stash

# 储藏并添加描述
git stash save "正在开发的功能"

# 查看储藏列表
git stash list

# 恢复最近的储藏
git stash pop

# 恢复指定储藏
git stash apply stash@{1}

# 删除储藏
git stash drop stash@{0}
git stash clear # 删除所有储藏

重置(Reset)和回退(Revert)

重置到特定提交

# 软重置(保留工作区修改)
git reset --soft HEAD~1

# 混合重置(保留工作区修改,重置暂存区)
git reset --mixed HEAD~1

# 硬重置(丢弃所有修改)
git reset --hard HEAD~1

# 重置到特定提交
git reset --hard commit-hash

回退提交

# 创建一个新的提交来撤销之前的提交
git revert commit-hash

# 回退多个提交
git revert older-commit..newer-commit

二分查找(Bisect)

使用二分查找定位问题

# 开始二分查找
git bisect start

# 标记当前为坏提交
git bisect bad

# 标记已知的好提交
git bisect good commit-hash

# 测试当前版本,然后标记好坏
git bisect good # 如果当前版本正常
git bisect bad # 如果当前版本有问题

# 结束二分查找
git bisect reset

子模块(Submodule)

添加子模块

git submodule add https://github.com/user/repo.git path/to/submodule

初始化和更新子模块

# 克隆包含子模块的项目
git clone --recurse-submodules https://github.com/user/main-repo.git

# 或者克隆后初始化
git submodule init
git submodule update

# 更新所有子模块
git submodule update --remote

钩子(Hooks)

常用 Git 钩子

Git 钩子位于 .git/hooks/ 目录下:

  • pre-commit: 提交前运行
  • prepare-commit-msg: 准备提交信息时运行
  • commit-msg: 提交信息验证
  • post-commit: 提交后运行
  • pre-push: 推送前运行

示例:pre-commit 钩子

#!/bin/sh

# 运行代码检查
npm run lint

# 如果检查失败,阻止提交
if [ $? -ne 0 ]; then
echo "代码检查失败,请修复后再提交"
exit 1
fi

重写历史

交互式 rebase

# 重写最近3次提交
git rebase -i HEAD~3

# 常用操作:
# pick - 使用提交
# reword - 使用提交但修改提交信息
# edit - 使用提交但暂停进行修改
# squash - 将提交合并到前一个提交
# fixup - 类似 squash 但丢弃提交信息
# drop - 删除提交

修改多个提交的作者信息

git filter-branch --env-filter '
OLD_EMAIL="old@email.com"
CORRECT_NAME="Correct Name"
CORRECT_EMAIL="correct@email.com"
if [ "$GIT_COMMITTER_EMAIL" = "$OLD_EMAIL" ]
then
export GIT_COMMITTER_NAME="$CORRECT_NAME"
export GIT_COMMITTER_EMAIL="$CORRECT_EMAIL"
fi
if [ "$GIT_AUTHOR_EMAIL" = "$OLD_EMAIL" ]
then
export GIT_AUTHOR_NAME="$CORRECT_NAME"
export GIT_AUTHOR_EMAIL="$CORRECT_EMAIL"
fi
' --tag-name-filter cat -- --branches --tags

高级配置

配置别名

# 常用别名配置
git config --global alias.co checkout
git config --global alias.br branch
git config --global alias.ci commit
git config --global alias.st status
git config --global alias.unstage 'reset HEAD --'
git config --global alias.last 'log -1 HEAD'
git config --global alias.lg "log --color --graph --pretty=format:'%Cred%h%Creset -%C(yellow)%d%Creset %s %Cgreen(%cr) %C(bold blue)<%an>%Creset' --abbrev-commit"

配置默认编辑器

# 设置 VS Code 为默认编辑器
git config --global core.editor "code --wait"

# 设置 Vim 为默认编辑器
git config --global core.editor "vim"

疑难解答

恢复丢失的提交

# 查看所有操作记录
git reflog

# 恢复特定的提交
git checkout commit-hash
git checkout -b recovered-branch

清理仓库

# 清理未跟踪的文件
git clean -n # 预览将要删除的文件
git clean -f # 删除未跟踪的文件
git clean -fd # 删除未跟踪的文件和目录

# 优化仓库
git gc --aggressive

这些高级功能可以帮助你更好地管理复杂的项目和工作流程,提高开发效率。