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