Imagine a situation where the remote has changes you don't:
remote | A - B - C - D - E
|
local | A - B - C
Here you can git pull --ff-only
, because it's possible to fast-forward from C
to E
. Now imagine you've also made changes:
remote | A - B - C - D - E
|
local | A - B - C - F - G
If you git pull --ff-only
, it will be rejected, because you can't fast-forward from G
to E
; per the docs (emphasis mine):
With --ff-only
, resolve the merge as a fast-forward when possible.
When not possible, refuse to merge and exit with a non-zero status.
There are two ways to solve this, either:
- creating a merge commit (the default if a fast-forward isn't possible, or can be forced with
--no-ff
); or
- rebasing (
--rebase
).
If you git pull --rebase
, it will roll your local copy back to C
, fast-forward to E
, then replay F
and G
onto the new parent, leaving:
remote | A - B - C - D - E
|
local | A - B - C - D - E - F' - G'
--autostash
is a separate argument, per the docs:
This means that you can run the operation on a dirty worktree.
In both cases above I assumed a clean worktree (i.e. git status
shows "nothing to commit, working tree clean" - you have no uncommitted local changes), for simplicity's sake, but sometimes you might want to pull new changes while you have local work in progress.