Git 常用命令(面试与实战版)
一、面试常考点
1. merge 和 rebase 区别
merge 保留分叉历史,安全直观;rebase 重写提交基线,历史更线性。
2. reset、revert、reflog 区别
reset 改本地指针,revert 反向提交更安全,reflog 用于“后悔药”恢复历史。
3. 什么时候用 cherry-pick
只挑选某个提交到当前分支,不做整分支合并。
二、基础命令(每天都用)
# 查看状态
git status
# 查看改动
git diff
git diff --staged
# 添加与提交
git add .
git commit -m "feat: add login"
# 查看历史
git log --oneline --graph --decorate --all
三、分支协作(标准流程)
# 拉最新主干
git checkout main
git pull origin main
# 创建功能分支
git checkout -b feat/order-refactor
# 开发完成后推送
git push -u origin feat/order-refactor
合并前建议
- 先同步主干再提 PR。
- 先本地自测再推送。
- 保持提交信息语义化(
feat/fix/docs/refactor/chore)。
四、rebase 专项(重点)
1. 一句话理解 rebase
把“当前分支的一串提交”重新播放到新的基线上,提交哈希会变化。
2. 日常 rebase(把功能分支基于最新 main)
# 在功能分支上
git fetch origin
git rebase origin/main
# 有冲突:修复后
git add .
git rebase --continue
# 跳过当前冲突提交
git rebase --skip
# 放弃本次 rebase
git rebase --abort
冲突处理闭环:
git status看冲突文件。- 修复冲突并
git add <file>。 git rebase --continue继续,直到结束。
3. 交互式 rebase(整理提交历史)
# 整理最近 5 个提交
git rebase -i HEAD~5
常用指令:
pick:保留提交reword:改提交信息squash:合并到前一个提交fixup:合并但丢弃当前提交信息edit:停下来修改该提交drop:删除提交
真实 todo 列表示例(面试高频):
# 目标:把「修 typo」「补日志」合并进功能提交,并改一个提交信息
pick a1b2c3d feat: add order API
fixup d4e5f6a chore: add debug log
squash e7f8g9h fix: typo in order API
reword f1a2b3c feat: add order tests
pick 1a2b3c4 docs: update readme
执行后效果:
fixup和squash对应的提交会并入前一个提交。squash会让你编辑合并后的提交信息,fixup不会。reword会停下来让你改该条提交信息。- 最终提交数量减少,历史更线性、更易审查。
面试口述句:
rebase -i 我主要用来“压提交 + 改 message + 删噪音提交”,让 PR 历史更清晰。
4. 高频场景模板
场景 A:合并多个“碎提交”
git rebase -i HEAD~5
# 把后续碎提交改成 squash/fixup
场景 B:把 B 分支挂到 A 分支后(--onto)
# 当前在 feature-b,把它从旧 base 挪到新 base
git rebase --onto feature-a old-base feature-b
分支关系图(示意):
执行前:
main: M1 --- M2 --- M3
\
feature-a: A1 --- A2
\
feature-b: B1 --- B2
^
old-base
执行:
git rebase --onto feature-a old-base feature-b
执行后:
main: M1 --- M2 --- M3
\
feature-a: A1 --- A2
\
feature-b: B1' --- B2'
参数含义:
new-base(这里是feature-a):提交要“挂载到哪里”。old-base:从哪个分叉点之后开始搬运提交。branch(这里是feature-b):被搬运的目标分支。
一句话记忆:
把 branch 上“old-base 之后的提交”摘下来,接到 new-base 后面。
场景 C:拆分一个大提交
git rebase -i HEAD~3
# 把目标提交改成 edit,停下后执行:
git reset HEAD^
git add -p
git commit -m "feat: part 1"
git add .
git commit -m "feat: part 2"
git rebase --continue
5. rebase 后推送
# rebase 重写了历史,需强推(更安全方式)
git push --force-with-lease
6. 何时不要 rebase
已被多人共享并基于其开发的公共分支,不建议随意 rebase 重写历史。
7. 面试口述模板(30 秒)
我对 rebase 的理解是“重放提交到新基线”。日常我会先 fetch,再在功能分支执行 rebase origin/main,保证提交历史线性;有冲突就按 status -> 修复 -> add -> continue 处理。对外推送时我只用 --force-with-lease,避免误覆盖同事提交;公共共享分支默认不用 rebase 改历史。
五、merge 专项
# 将 feature 合并到当前分支
git merge feature/xxx
# 产生冲突后:修复 -> add -> commit
fast-forward 与 --no-ff
- fast-forward:线性推进,不生成额外 merge commit。
--no-ff:保留一次合并节点,审计更清晰。
六、回滚与恢复(高频救命)
1. reset(本地回退)
# 回退提交,但保留改动在工作区
git reset --mixed HEAD~1
# 回退提交并保留在暂存区
git reset --soft HEAD~1
# 丢弃改动(危险)
git reset --hard HEAD~1
2. revert(团队协作更安全)
# 生成一个反向提交,不改已有历史
git revert <commit-hash>
3. reflog(恢复误操作)
# 查看 HEAD 变更轨迹
git reflog
# 回到某个历史位置
git reset --hard <reflog-hash>
七、挑提交与临时存储
1. cherry-pick
# 拣选某个提交到当前分支
git cherry-pick <commit-hash>
2. stash
# 临时保存工作区
git stash
# 查看 stash 列表
git stash list
# 恢复最近一次 stash
git stash pop
八、冲突处理建议
- 先理解冲突代码“谁对业务负责”。
- 小块提交冲突修复,避免一次性大改。
- 解决后必须本地回归再继续流程。
- 对关键文件加测试,避免二次冲突回归。
九、常见面试题速答
1. merge 还是 rebase,你怎么选
团队协作默认 merge 更稳;个人分支整理历史可用 rebase。
2. 提交错了怎么改
最近一次可用 commit --amend;更早提交用 rebase -i。
3. 强推为什么建议 --force-with-lease
它会校验远端分支是否被别人更新,避免误覆盖他人提交。