Skip to main content

Git

一、基础概念与核心原理

  1. Git 与其他版本控制工具的区别(如 SVN)

    • 分布式 vs 集中式:Git 本地有完整仓库,无需联网即可提交;SVN 依赖中央服务器。
    • 分支轻量级:Git 分支是指针操作,创建/切换成本极低;SVN 分支是文件复制。
    • 内容寻址存储:Git 按数据内容生成哈希值,确保数据不可变;SVN 按文件版本管理。
  2. Git 核心组件与工作流程

    • 四区域模型
      • 工作区(Working Directory):本地文件系统中的代码。
      • 暂存区(Staging Area/Index):git add 后等待提交的变更。
      • 本地仓库(Local Repository):git commit 后的历史版本(含对象库、 refs 等)。
      • 远程仓库(Remote Repository):团队共享的代码托管平台(如 GitHub)。
    • 操作流程示例git clone → 修改文件 → git addgit commitgit push
  3. Git 对象模型(底层原理)

    • 三大对象
      • Blob:存储文件内容(无文件名)。
      • Tree:存储目录结构(包含 Blob 和子 Tree 的引用)。
      • Commit:存储提交信息(作者、时间、父提交引用、指向 Tree 的指针)。
    • 引用(Refs):如 HEAD(当前分支指针)、分支名、标签(Tag),本质是指向 Commit 的指针。

二、常用命令与操作场景

  1. 基础操作命令

    • 克隆与拉取git clone(克隆仓库)、git pull(拉取并合并远程分支)。
    • 提交流程git add(暂存变更)、git commit(提交到本地)、git push(推送到远程)。
    • 历史查看git log(查看提交历史)、git diff(对比文件差异)。
  2. 分支与合并

    • 分支管理git branch(创建/查看分支)、git checkout(切换分支)、git switch(新版切换分支)。
    • 合并策略
      • git merge:创建合并提交(保留分支历史,适合团队协作)。
      • git rebase:将分支历史重放至目标分支顶端(保持线性历史,适合个人开发)。
    • 面试高频问题
      • merge 和 rebase 的区别?
        → merge 生成新提交,保留分支合并痕迹;rebase 改写历史,使分支更简洁。
      • 什么场景用 rebase?
        → 个人开发分支未推送到远程时,避免污染公共分支历史。
  3. 撤销与回滚

    • git reset:移动 HEAD 指针,可重置暂存区和工作区(危险,可能丢失未提交变更)。
    • git revert:创建新提交撤销旧提交(安全,适合已推送到远程的分支)。
    • git checkout:恢复文件到指定版本(或放弃工作区修改)。
  4. 冲突解决

    • 冲突场景:多人修改同一文件同一区域,合并时需手动解决。
    • 解决步骤
      1. git mergegit rebase 时出现冲突,编辑冲突文件(标记为 <<<<<<< ======= >>>>>>>)。
      2. 保留正确代码,删除冲突标记。
      3. git add 冲突文件,git commit 完成合并。

三、分支策略与团队协作

  1. 主流分支模型

    • Git Flow
      • 主分支:master(稳定版本)、develop(开发主干)。
      • 功能分支:feature/*(开发新功能)。
      • 发布分支:release/*(准备上线)。
      • 热修复分支:hotfix/*(紧急 bug 修复)。
    • GitHub Flow/Trunk-Based Development
      • 简化分支,以 main 为主干,功能分支直接合并到 main(适合快速迭代团队)。
  2. 团队协作最佳实践

    • 提交规范:使用结构化 commit message(如 Angular 规范:feat: 添加用户登录功能)。
    • 代码审查:通过 PR(Pull Request)机制,强制审查后合并。
    • 分支管理:定期清理过时分支,避免分支泛滥。
    • 钩子脚本(Hooks):使用 pre-commit 钩子检查代码格式(如通过 husky 集成 ESLint)。

四、高级功能与问题解决

  1. 高级命令与场景

    • git cherry-pick:将其他分支的某个提交应用到当前分支(适合跨分支移植功能)。
    • git reflog:记录 HEAD 的所有变更,用于恢复误删的提交(git reset --hard <reflog哈希>)。
    • git stash:临时保存未提交的修改(适合切换分支前暂存工作)。
    • git submodule vs git subtree
      → submodule 维护独立仓库引用(适合依赖外部项目);
      → subtree 将外部仓库合并为当前仓库的子目录(适合集成内部组件)。
  2. 性能与大仓库优化

    • Git LFS(Large File Storage):存储大文件(如图片、视频)到远程服务器,避免仓库膨胀。
    • 稀疏检出(Sparse Checkout):仅克隆仓库中的部分目录(git clone --sparse + git sparse-checkout)。
  3. 常见问题与解决方案

    • 问题:误删了未推送的提交,如何恢复?
      → 用 git reflog 找到对应哈希,git reset --hard <哈希>
    • 问题:远程分支被删除,本地如何恢复?
      git fetch 后用 git branch -r 查看远程分支引用,git checkout -b <分支名> origin/<原分支名>

五、原理深入与扩展

  1. Git 如何保证数据完整性?

    • 所有对象(Blob/Tree/Commit)通过 SHA-1 哈希标识,修改任意内容会导致哈希变化,Git 可通过哈希校验数据一致性。
  2. 分布式协作中的冲突处理

    • 多人推送至同一分支时,可能遇到 non-fast-forward 错误,需先 git pull 合并远程变更,再 git push
  3. Git 钩子(Hooks)的类型

    • 客户端钩子:pre-commit(提交前检查)、prepare-commit-msg(修改提交信息)。
    • 服务端钩子:pre-receive(推送前校验,防止非法提交)。

六、面试加分项

  • 结合项目经验:举例说明在团队中如何用 Git 解决具体问题(如某次复杂冲突的处理、分支策略的优化)。
  • 工具链集成:了解 Git 与 CI/CD 的结合(如 GitHub Actions 中通过 Git 触发构建)。
  • 原理延伸:了解 Git 的底层存储(如打包文件 pack 的机制)、分布式协同算法(如 Git 的冲突解决策略)。

总结备考方向

  1. 背熟核心命令:掌握常用命令的参数与场景(如 merge/rebase/reset/revert 的区别)。
  2. 理解原理逻辑:从对象模型到分支合并,用逻辑图辅助记忆(如 Commit 树的结构)。
  3. 模拟实战问题:思考面试中可能的场景题(如“如何回滚已推送的错误提交”),用具体命令步骤回答。
  4. 关注团队实践:了解主流分支策略的优缺点,结合团队规模说明适用场景。