# git pull --ff-only errors when git merge --ff-only passes

3 messages from 2024-06-03 to 2024-06-03. Participants: Arundas T C, Junio C Hamano, brian m. carlson.
Thread: https://gitlist.dev/t/61576

## Arundas T C, 2024-06-03 06:28

Subject: git pull --ff-only errors when git merge --ff-only passes
Message-ID: <CAKRNJbAnUBmR5MHY=uSF1A3docO-uxWG4agWuFZEyPUnduyWHw@mail.gmail.com>
URL: https://gitlist.dev/e/CAKRNJbAnUBmR5MHY%3DuSF1A3docO-uxWG4agWuFZEyPUnduyWHw%40mail.gmail.com

```
Thank you for filling out a Git bug report!
Please answer the following questions to help us understand your issue.

What did you do before the bug happened? (Steps to reproduce your issue)

1. In a remote repository, have a commit that's only in remote at the
tip of the current branch in local.
2. In the local clone of this repository, edit some files and have
unstaged changes.
3. In local, run `git pull --ff-only`.

What did you expect to happen? (Expected behavior)

Fast-forward the local branch to match the remote branch, similar to
`git merge --ff-only`. Handle any merge conflicts the same way that
`git merge --ff-only` does.

What happened instead? (Actual behavior)

error: cannot pull with rebase: You have unstaged changes.
error: Please commit or stash them.

What's different between what you expected and what actually happened?

It errored out because of unstaged changes, even though doing `git
merge --ff-only` will correctly do what's expected. See below.

Anything else you want to add:

After doing `git fetch`, I can do `git merge --ff-only` and this
fast-forwards the branch as expected. Isn't `git pull --ff-only`
basically the same as doing these two (fetch and merge)?

Please review the rest of the bug report below.
You can delete any lines you don't wish to share.


[System Info]
git version:
git version 2.45.1
cpu: arm64
no commit associated with this build
sizeof-long: 8
sizeof-size_t: 8
shell-path: /bin/sh
feature: fsmonitor--daemon
uname: Darwin 23.5.0 Darwin Kernel Version 23.5.0: Wed May  1 20:12:58
PDT 2024; root:xnu-10063.121.3~5/RELEASE_ARM64_T6000 arm64
compiler info: clang: 15.0.0 (clang-1500.3.9.4)
libc info: no libc information available
$SHELL (typically, interactive shell): /bin/zsh


[Enabled Hooks]
post-checkout
post-commit
post-merge
pre-push

```

## Junio C Hamano, 2024-06-03 15:31

Subject: Re: git pull --ff-only errors when git merge --ff-only passes
Message-ID: <xmqqo78i6o21.fsf@gitster.g>
URL: https://gitlist.dev/e/xmqqo78i6o21.fsf%40gitster.g
In-Reply-To: <CAKRNJbAnUBmR5MHY=uSF1A3docO-uxWG4agWuFZEyPUnduyWHw@mail.gmail.com>

```
Arundas T C <arundas.tc@gmail.com> writes:

> What happened instead? (Actual behavior)
>
> error: cannot pull with rebase: You have unstaged changes.
> error: Please commit or stash them.
>
> What's different between what you expected and what actually happened?
>
> It errored out because of unstaged changes, even though doing `git
> merge --ff-only` will correctly do what's expected. See below.

But you are not doing "merge" but "rebase", according to the error
message.  "pull" was told to do "rebase" instead of "merge" and it
stopped because it did not want to clobber the local changes.  So
it appears that what "merge --ff-only" would have do has very little
to do with what "pull --ff-only" you configured would do, no?


```

## brian m. carlson, 2024-06-03 21:30

Subject: Re: git pull --ff-only errors when git merge --ff-only passes
Message-ID: <Zl417UT7n4-FQ2xj@tapette.crustytoothpaste.net>
URL: https://gitlist.dev/e/Zl417UT7n4-FQ2xj%40tapette.crustytoothpaste.net
In-Reply-To: <CAKRNJbAnUBmR5MHY=uSF1A3docO-uxWG4agWuFZEyPUnduyWHw@mail.gmail.com>

```
On 2024-06-03 at 06:28:41, Arundas T C wrote:
> Thank you for filling out a Git bug report!
> Please answer the following questions to help us understand your issue.
> 
> What did you do before the bug happened? (Steps to reproduce your issue)
> 
> 1. In a remote repository, have a commit that's only in remote at the
> tip of the current branch in local.
> 2. In the local clone of this repository, edit some files and have
> unstaged changes.
> 3. In local, run `git pull --ff-only`.
> 
> What did you expect to happen? (Expected behavior)
> 
> Fast-forward the local branch to match the remote branch, similar to
> `git merge --ff-only`. Handle any merge conflicts the same way that
> `git merge --ff-only` does.
> 
> What happened instead? (Actual behavior)
> 
> error: cannot pull with rebase: You have unstaged changes.
> error: Please commit or stash them.

This indicates that you've set pull.rebase, so a `git pull` does a fetch
and a rebase.

> What's different between what you expected and what actually happened?
> 
> It errored out because of unstaged changes, even though doing `git
> merge --ff-only` will correctly do what's expected. See below.
> 
> Anything else you want to add:
> 
> After doing `git fetch`, I can do `git merge --ff-only` and this
> fast-forwards the branch as expected. Isn't `git pull --ff-only`
> basically the same as doing these two (fetch and merge)?

`git merge` doesn't do a rebase.  It does a merge, which can sometimes
be done with a dirty tree.  `git pull` _normally_ does a fetch and a
merge, but in this case, you've asked it to do a fetch and a rebase,
which has different constraints.  The result will almost certainly be
identical (since it's just a fast-forward), but rebases typically don't
allow you to have a dirty working tree.
-- 
brian m. carlson (they/them or he/him)
Toronto, Ontario, CA

```
