Command Reference

git pull 教程

解释 git pull 是 fetch 加整合的组合动作,什么时候 pull 很方便,什么时候 fetch-first 更稳,以及 rebase / ff-only 会怎样改变结果。

适合谁看
  • 已经会基本提交和分支操作的开发者
  • 想理解命令边界与风险的人
前置知识
  • 知道工作区、暂存区、提交的基本关系
  • 能读懂 `git status` 和简单历史图
常见风险
  • 误把本地整理命令用到共享历史
  • 在没确认恢复路径前直接继续改写历史

一句话理解

git pull 会先从远端抓取更新,再把这些更新整合进当前分支。

pull 其实是两步动作

git pull 看起来只是一条短命令,但它把“获取远端状态”和“修改当前分支”两个决定绑在了一起。很多误操作都出在第二步。

为什么它特别容易让人误解

很多人会把 pull 当成“同步按钮”。
但实际上,pull 可能会:

  • 直接快进当前分支
  • 产生 merge commit
  • 以 rebase 的方式改写本地提交祖先关系
  • 因策略限制或冲突而失败

所以真正要问的问题不是“要不要同步”,而是:

这次同步后,我希望当前分支变成什么样?

常见写法

git pull
git pull --rebase
git pull --ff-only
  • git pull:使用当前默认整合策略
  • git pull --rebase:先 fetch,再把本地提交重放到上游之后
  • git pull --ff-only:只有能快进时才成功,否则直接失败

什么时候 pull 适合直接用

在这些前提下,git pull 可以很顺手:

  • 团队已经统一了默认同步策略
  • 你知道当前分支是否用 merge、rebase 或 ff-only
  • 这是普通同步,不是高风险历史修复

如果你想完全掌控行为,仍然更推荐先 fetch,再明确选择 merge 或 rebase。

更稳的共享分支同步顺序

很多团队更保守的写法是:

  1. git status
  2. git fetch origin
  3. git log --oneline --graph --decorate --all -12
  4. 再决定 merge、rebase,或者先停下来

它只是多一步,但会显著提升判断质量。

fetch-first 不是保守过度,而是让判断前置

真正的目标不是永远不用 git pull,而是避免在没看清远端变化前就把整合动作自动做掉。

--ff-only 什么时候特别好用

--ff-only 适合这些场景:

  • 希望分支历史保持简单可预期
  • 不想悄悄产生 merge commit
  • 希望出现分叉时直接失败,逼自己先看清情况

它尤其适合:

  • 受保护的主分支
  • 自动化同步脚本
  • 不希望开发者无意中改历史形状的团队

--rebase 改变了什么

git pull --rebase 并不是“另一种同步”,而是:

在同步时顺手重写本地提交的祖先关系。

它往往适合个人功能分支,但仍然要先问:

  • 这些本地提交有没有共享出去?
  • 当前分支是否已经进入 review 或 CI?
  • 这里用 merge 会不会比 rebase 更透明?

图例理解

先抓取,再整合只要把下载和分支变更拆开理解,pull 的行为就会清晰很多。fetch 负责了解远端状态,integration 负责改变本地历史形状。
输入
远端引用本地跟踪引用当前分支
可能结果
更新后的 remote-tracking refs快进结果merge 或 rebase 后的历史
如果 pull 的结果让你意外,通常不是因为 Git 随机工作,而是整合策略在隐式生效。

常见错误

  • 工作区还不干净就直接 pull,把本地改动问题和同步问题混在一起
  • 以为每次 pull 都只是 harmless fast-forward
  • 对共享分支使用 --rebase,却没先确认是否安全
  • 不知道 pull.rebasepull.ff 当前配置的默认行为
pull 不是天然安全的

一条命令写起来很方便,不代表它的后果就简单。只要当前分支历史形状重要,就应该在整合前先看清楚。

跟着做一遍

练习:比较普通 pull、ff-only 和 fetch-first

目标是把 pull 看成一种策略选择,而不是单纯同步快捷键。

准备
git switch -c lab/pull-demo
# 模拟本地有提交,同时上游分支也向前移动
动手试
  1. 先运行 `git fetch`,再用 `git log --oneline --graph --decorate --all -12` 看分叉。
  2. 尝试 `git pull --ff-only`,观察它什么时候成功、什么时候失败。
  3. 如果分支已经分叉,再判断 `git pull --rebase` 还是 `git merge` 更合适。
会发生什么
  • 你会把 pull 看成“抓取 + 整合策略”的组合。
  • 会理解 ff-only 为什么能防止意外 merge。
  • 会逐渐形成“先看清,再整合”的同步习惯。
常见错误判断
  • 尽量不要带着不相关的 unstaged 改动去 pull。
  • 如果结果出乎意料,先检查 `pull.rebase` 和 `pull.ff`,不要靠猜。
  • 如果分支已经共享,把 rebase 当成协作决定,而不是个人习惯。