`git pull --rebase --autostash` 和 `git pull --ff-only` 之间的区别?

Difference between `git pull --rebase --autostash` and `git pull --ff-only`?

以下问题 的解决方案同时使用:

我对应该使用哪一个有点困惑。他们真的达到了同样的结果吗?非常相似 question 被问到哪个没有 --autostash 参数以及 --rebase

想象一下遥控器发生变化而您没有发生变化的情况:

remote | A - B - C - D - E
       |
local  | A - B - C

这里可以git pull --ff-only,因为可以fast-forward从CE。现在假设您还进行了更改:

remote | A - B - C - D - E
       |
local  | A - B - C - F - G

如果你git pull --ff-only,会被拒绝,因为你不能fast-forward从GE;每 the docs(强调我的):

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.

有两种方法可以解决这个问题:

  • 创建合并提交(如果 fast-forward 不可能,则默认设置,或者可以使用 --no-ff 强制执行);或
  • 变基(--rebase)。

如果您 git pull --rebase,它会将您的本地副本回滚到 C,fast-forward 回滚到 E,然后重播 FG 到新的 parent,留下:

remote | A - B - C - D - E
       |
local  | A - B - C - D - E - F' - G'

--autostash 是一个 单独的 参数,根据 the docs:

This means that you can run the operation on a dirty worktree.

在上面的两种情况下,我假设一个干净的工作树(即 git status 显示 “没有什么可提交的,工作树是干净的” - 你没有未提交的本地更改),为简单起见,但有时您可能希望在进行本地工作时进行新更改。