返回首页

Git 常用命令(面试与实战版)

一、面试常考点

1. mergerebase 区别

merge 保留分叉历史,安全直观;rebase 重写提交基线,历史更线性。

2. resetrevertreflog 区别

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

合并前建议

  1. 先同步主干再提 PR。
  2. 先本地自测再推送。
  3. 保持提交信息语义化(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

冲突处理闭环:

  1. git status 看冲突文件。
  2. 修复冲突并 git add <file>
  3. 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

执行后效果:

  1. fixupsquash 对应的提交会并入前一个提交。
  2. squash 会让你编辑合并后的提交信息,fixup 不会。
  3. reword 会停下来让你改该条提交信息。
  4. 最终提交数量减少,历史更线性、更易审查。

面试口述句: 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'

参数含义:

  1. new-base(这里是 feature-a):提交要“挂载到哪里”。
  2. old-base:从哪个分叉点之后开始搬运提交。
  3. 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. 先理解冲突代码“谁对业务负责”。
  2. 小块提交冲突修复,避免一次性大改。
  3. 解决后必须本地回归再继续流程。
  4. 对关键文件加测试,避免二次冲突回归。

九、常见面试题速答

1. merge 还是 rebase,你怎么选

团队协作默认 merge 更稳;个人分支整理历史可用 rebase

2. 提交错了怎么改

最近一次可用 commit --amend;更早提交用 rebase -i

3. 强推为什么建议 --force-with-lease

它会校验远端分支是否被别人更新,避免误覆盖他人提交。