🐙 Git 从入门到面试能吹的那些事

"会用 Git 不稀奇,能讲明白才值钱。"

本文让你从 git add . 的机械工人,变成能聊底层原理 + 面试加分的 Git 社交达人。


1. Git 是什么?

先来个官方说法:

Git 是一个分布式版本控制系统,用来记录代码变更历史,方便多人协作。

翻译成人话:

  • 它是代码界的时光机
  • 支持你随时穿越回过去(reflog 就像游戏存档)
  • 多人协作时,它就像一群厨子一起炒菜,每个人有自己的灶台,最后再把菜端到一张桌上。

2. Git 的三大区域

  • 工作区(Working Directory) :你正在写的代码文件。
  • 暂存区(Staging Area) :已经打包好,等着快递的改动。
  • 本地仓库(Local Repository) :正式存档的历史版本。

命令速记:

bash 复制代码
git add .       # 把工作区改动送到暂存区
git commit -m "fix: 修复登录 Bug"  # 把暂存区的改动送进历史

3. 常用 Git 命令(带脑洞解释)

命令 作用 脑洞版记忆
git status 看当前状态 "摸一摸脉搏"
git log 看历史记录 "翻家谱"
git diff 看改了啥 "照镜子对比一下"
git branch 看分支 "看看我开了几条平行世界"
git switch / git checkout 切换分支 "从一个世界跳到另一个世界"
git merge 合并分支 "两个世界融合"
git rebase 变基 "时空线性整理"

4. 分支:Git 的平行宇宙

  • 主分支(main/master) :上线版本的世界线。
  • 功能分支(feature/xxx) :新功能试验田。
  • 修复分支(hotfix/xxx) :紧急修 bug 的世界。
bash 复制代码
# 创建并切换
git switch -c feature/login

# 合并回主分支
git switch main
git merge feature/login

小贴士

  • 合并用 merge 安全可靠
  • 想要历史好看,可以 rebase(别在别人用的分支上乱 rebase)

5. 远程协作的日常

bash 复制代码
git clone <url>         # 拿到别人的代码副本
git fetch               # 拉取最新改动(不影响你当前文件)
git pull                # 拉取 + 合并(或 rebase)
git push origin main    # 推送你的改动

脑补场景:

  • fetch:去看快递柜里有什么新快递,但先不取
  • pull:看完直接取回家
  • push:你把自己的菜送到团队大锅里

6. 史诗级救命技能

  1. 撤销最近一次提交(保留改动)

    bash 复制代码
    git reset --soft HEAD~1
  2. 回到某个提交

    css 复制代码
    git reset --hard <commit-id>
  3. 找回"丢失"的提交

    css 复制代码
    git reflog
    git reset --hard <reflog-id>
  4. 挑一个提交到当前分支

    python 复制代码
    git cherry-pick <commit-id>

记住reset --hard 像是核弹,一定确认无误再按。


7. 面试常考 Git 题

Q1: Git pull 和 Git fetch 有什么区别?

  • fetch:只下载远程最新记录,本地不动。
  • pull:相当于 fetch + merge(或 rebase)。
    面试加分:有时先 fetch 再手动合并更安全。

Q2: merge 和 rebase 的区别?

  • merge:保留分支的合并历史,可能有多叉结构。
  • rebase:将提交"搬到"目标分支顶部,历史线性更清爽。
    加分点:团队协作时,在共享分支用 merge,自己分支可以 rebase 保持整洁。

Q3: 如何撤销已经 push 上去的错误提交?

  • 如果要保留历史:用 git revert 生成一个反向提交。
  • 如果可以改历史(风险大):用 git reset --hard + git push --force-with-lease,但要确保没人基于你的提交工作。

Q4: .gitignore 是干嘛的?

  • 用来指定 Git 不跟踪的文件(如 node_modules/dist/.env)。
  • 注意 .gitignore 只能忽略未被追踪 的文件,已经提交过的需要用 git rm --cached 移除追踪。

Q5: Git rebase -i 有什么用?

  • -i 是交互式变基,可以合并提交(squash)、修改提交信息(reword)、删除提交(drop)、调整顺序等。
  • 面试加分:常用来清理杂乱的历史提交,让 PR 更优雅。

8. 总结 & 面试吹法

  • 会基本命令:加、提、切、合、推、拉。

  • 会救命操作:reset、reflog、stash、cherry-pick。

  • 理解原理:三大区域 + 分支模型。

  • 面试吹点:

    1. 团队分支策略(Git Flow / GitHub Flow)
    2. 规范化提交(Conventional Commits)
    3. 在 CI/CD 流程中结合 Git Hooks 提升质量

9. 送你一份 Git 冷笑话

面试官:你会 Git 吗?

我:会啊,我是 Git 大师。

面试官:那帮我 reset 一下刚才问的问题。

我:git reset --hard

面试官:......你回家等通知吧。

相关推荐
一条上岸小咸鱼15 分钟前
Kotlin 基本数据类型(一):Numbers
android·前端·kotlin
前端小巷子39 分钟前
Vue 事件绑定机制
前端·vue.js·面试
uhakadotcom1 小时前
开源:subdomainpy快速高效的 Python 子域名检测工具
前端·后端·面试
爱加班的猫1 小时前
Node.js 中 require 函数的原理深度解析
前端·node.js
用户8165111263971 小时前
WWDC 2025 Build a SwiftUI app with the new design
前端
伍哥的传说1 小时前
Vue 3.5重磅更新:响应式Props解构,让组件开发更简洁高效
前端·javascript·vue.js·defineprops·vue 3.5·响应式props解构·vue.js新特性
阅文作家助手开发团队_山神1 小时前
第一章: Mac Flutter Engine开发准备工作
前端·flutter
菜牙买菜1 小时前
Hicharts入门
前端·vue.js·数据可视化
摸着石头过河的石头1 小时前
手把手教你入门 MCP:模型上下文协议与 Trae IDE 中的实践
前端·mcp