Git高级用法教程
Git 的高级用法涉及 高效分支管理、提交历史操作、冲突解决、子模块、钩子脚本 等,以下是详细教程:
1. 分支管理(Branching)
1.1 分支策略
- 主分支:
main
/master
:稳定版,仅用于发布。develop
:开发主分支,合并功能分支。
- 辅助分支:
feature/*
:新功能开发(如feature/login
)。hotfix/*
:紧急修复生产环境 Bug。release/*
:预发布分支(测试、修复)。 示例:# 创建并切换到新功能分支 git checkout -b feature/login # 合并到 develop 分支 git checkout develop git merge feature/login --no-ff # 保留分支历史
1.2 变基(Rebase)
- 作用:整理提交历史,使分支线性整洁。
- 与合并的区别:
merge
保留分支拓扑结构,生成合并提交。rebase
将当前分支的提交“移植”到目标分支最新提交之后。 示例:
注意:变基会改写历史,仅限本地分支或协作分支未共享时使用。# 将 feature 分支变基到 develop git checkout feature/login git rebase develop # 解决冲突后继续 git add . git rebase --continue # 强制推送(如果已推送过) git push origin feature/login --force
2. 提交历史操作
2.1 修改提交(Commit Amend)
- 用途:修正最后一次提交的 message 或文件。
git commit --amend -m "新的提交信息" git push origin branch --force # 强制更新远程
2.2 交互式变基(Interactive Rebase)
- 用途:合并、拆分、删除或重排提交。
在编辑界面中:git rebase -i HEAD~3 # 修改最近 3 次提交
squash
:合并提交。edit
:暂停修改提交内容。drop
:删除提交。
2.3 重置(Reset)
- 软重置(
--soft
):仅移动HEAD
,保留改动在暂存区。 - 混合重置(
--mixed
,默认):移动HEAD
并取消暂存。 - 硬重置(
--hard
):彻底丢弃改动(慎用!)。git reset --soft HEAD~1 # 撤销最后一次提交,保留改动 git reset --hard abc123 # 回退到指定提交,丢弃所有改动
3. 高级合并与冲突解决
3.1 合并策略
--no-ff
:强制生成合并提交(保留分支历史)。--squash
:将多个提交压缩成一个。git merge feature/login --no-ff
3.2 冲突解决
- 手动编辑冲突文件(Git 会标记
<<<<<<<
和>>>>>>>
)。 - 使用工具(如
vimdiff
、VS Code
或git mergetool
)。 - 标记冲突已解决:
git add resolved_file.txt git commit # 生成合并提交
4. 子模块(Submodule)
- 用途:在项目中嵌套其他 Git 仓库(如公共库)。
# 添加子模块 git submodule add https://github.com/user/repo.git path/to/submodule # 初始化并更新子模块 git submodule update --init --recursive # 更新子模块到最新提交 git submodule foreach git pull origin main
5. Git 钩子(Hooks)
- 用途:在特定事件(如提交、推送)触发自定义脚本。
- 位置:
.git/hooks/
(如pre-commit
、post-receive
)。 示例:pre-commit
检查代码格式
赋予执行权限:#!/bin/sh # 检查 ESLint npm run lint || exit 1
chmod +x .git/hooks/pre-commit
6. 高级日志与搜索
6.1 定制化日志
git log --graph --oneline --decorate # 图形化显示分支
git log -p file.txt # 查看文件的变更历史
git log --since="2023-01-01" # 按时间过滤
6.2 二分查找(Bisect)
- 用途:快速定位引入 Bug 的提交。
git bisect start git bisect bad # 标记当前版本有 Bug git bisect good v1.0 # 标记旧版本正常 # Git 会自动切换到中间提交,测试后标记 good/bad git bisect reset # 结束
7. 其他高级技巧
7.1 暂存(Stash)
git stash # 暂存当前改动
git stash list # 查看暂存列表
git stash pop # 恢复最近暂存
git stash apply stash@{1} # 恢复指定暂存
7.2 引用日志(Reflog)
- 用途:找回误删的分支或提交。
git reflog # 查看所有操作历史 git checkout HEAD@{5} # 回到某个操作前的状态
7.3 稀疏检出(Sparse Checkout)
- 用途:只检出仓库的特定目录。
git config core.sparsecheckout true echo "src/libs/*" >> .git/info/sparse-checkout git checkout main
总结
功能 | 命令/示例 | 场景 |
---|---|---|
分支管理 | git rebase , --no-ff |
保持提交历史整洁 |
提交修改 | git commit --amend , rebase -i |
修复错误提交 |
冲突解决 | git mergetool , 手动编辑 |
合并冲突文件 |
子模块 | git submodule add |
嵌套外部仓库 |
钩子脚本 | .git/hooks/pre-commit |
自动化检查或部署 |
二分查找 | git bisect |
定位 Bug 引入点 |
掌握这些高级用法后,可以更高效地管理复杂项目、协作开发和维护代码历史。建议结合实践逐步深入!