--- topic: pull source_keys: - git-scm-pull-docs - context7-git-htmldocs --- # Pulling Default strategy: `--ff-only`. It fails on divergence, which forces a conscious choice instead of an accidental merge commit. - **Fast-forward only**: `git pull --ff-only` — the recommended default - **Rebase**: `git pull --rebase` replays your commits on top for linear history, but rewrites SHAs. Verify nothing being replayed has been pushed: rebasing published commits breaks everyone downstream. - **Merge**: `git pull --no-rebase` — three-way merge commit, preserves original commits, non-linear - **Rebase preserving merges**: `git pull --rebase=merges` keeps intentional local merge commits during the replay - **Stage without committing**: `git pull --squash` collapses incoming commits into staged changes; you write the message - **Merge strategy**: Git 2.34+ defaults to `ort` (`recursive` is now an alias for it). Strategy options such as `-X ours`, `-X theirs`, `-X ignore-space-change` pass through unchanged. - **Submodules**: `--recurse-submodules` only fetches submodules already checked out. Newly added ones are not initialized — use the `git-submodules` skill for those. ## On divergence A pull that diverges with no strategy configured fails, and that failure is the useful outcome. Report the divergence and the three ways out — `--ff-only`, `--rebase`, `--no-rebase` — and let the caller choose. Auto-merging a diverged branch buries a decision that belongs to the human. ## Config precedence `--ff-only` is not Git's default on an unset config, and never has been. Older versions silently merged on divergence; current ones refuse outright — verified on Git 2.39.5, a divergent pull with nothing configured prints the reconciliation hint and exits 128 with `fatal: Need to specify how to reconcile divergent branches.` The behaviour therefore still varies by installed version, and neither variant is the one you want. Set it explicitly. Highest wins: 1. Command-line flag (`--ff-only` / `--rebase` / `--no-rebase`) 2. `pull.rebase` config (global or local) 3. `branch..rebase` (branch-specific override) 4. `branch.autoSetupRebase` (set automatically when the tracking branch was created) ```bash git config pull.ff only # deterministic default across Git versions git config --global pull.rebase true git config branch.develop.rebase false # develop always merges, regardless of the global default ```