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 冲突解决

  1. 手动编辑冲突文件(Git 会标记 <<<<<<<>>>>>>>)。
  2. 使用工具(如 vimdiffVS Codegit mergetool)。
  3. 标记冲突已解决:
    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-commitpost-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 引入点

掌握这些高级用法后,可以更高效地管理复杂项目、协作开发和维护代码历史。建议结合实践逐步深入!









results matching ""

    No results matching ""