🐙 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

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

相关推荐
kk不中嘞2 分钟前
Webpack 核心原理剖析
前端·webpack·node.js
Yvonne爱编码5 分钟前
简述ajax、node.js、webpack、git
前端·git·ajax·webpack·node.js·visual studio
周小码6 分钟前
CesiumJS详解:打造专业级Web 3D地球仪与地图的JavaScript库
前端·javascript·3d
哆啦A梦158810 分钟前
Element-Plus
前端·vue.js·ts
IT_陈寒16 分钟前
🔥3分钟掌握JavaScript性能优化:从V8引擎原理到5个实战提速技巧
前端·人工智能·后端
前端小巷子39 分钟前
JS 打造丝滑手风琴
前端·javascript·面试
Mintopia1 小时前
多模态 AIGC 在 Web 内容创作中的技术融合实践:把“创作引擎”装进浏览器
前端·javascript·aigc
鹏多多.1 小时前
flutter-使用fluttertoast制作丰富的高颜值toast
android·前端·flutter·ios
Mintopia1 小时前
Next.js 的 Web Vitals 监测与 Lighthouse 分析:从底层到实战的快乐科学
前端·javascript·next.js
兵临天下api1 小时前
1688 item_get_app 接口深度分析及 Python 实现
trae