git-workflow's description enumerated the six domains it exists to route away from, so it competed for selection with the very skills it should be handing off to. It now triggers on the case it actually serves: an interactive request whose domain is not yet clear. Also clears frontmatter drift across the plugin and removes duplicated guidance in pc-run that had diverged from its reference.
42 lines
2.2 KiB
Markdown
42 lines
2.2 KiB
Markdown
---
|
|
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
|
|
|
|
The installed default varies by Git version — older versions merge on divergence, newer ones
|
|
default to `--ff-only` — so an unset `pull.ff` means the same pull behaves differently on different
|
|
machines. Set it explicitly.
|
|
|
|
Highest wins:
|
|
|
|
1. Command-line flag (`--ff-only` / `--rebase` / `--no-rebase`)
|
|
2. `pull.rebase` config (global or local)
|
|
3. `branch.<name>.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
|
|
```
|