git pull --rebase 通过保留本地更改来解决冲突

git pull --rebase resolve conflicts by keeping local changes

我重新定位到我当地的分支机构。与此同时,有人在远程对该分支进行了更改。我正在做 git pull --rebase。在currentincoming以及ourstheirs的命名方面,我不明白git如何解释这个命令。

我应该选择哪个来始终保留我的本地更改?此外,在我第一次与 master 进行 rebase 之后,出现了数十次冲突。是否有命令让 git pull --rebase 只保留我所有的本地更改,而不必手动执行?我知道 ourstheirs,但我不知道如何将这些关键字合并到 git pull --rebase 命令中。

这东西真是令人困惑,因为所有这些关键字在 merge 和 rebase 之间都颠倒了,然后 pull with rebase 增加了额外的混乱。

您的本地分支中支持更改的命令是:

git pull --rebase -X theirs

当直觉上您想说“我们的”时,您必须说“他们的”的原因是因为与合并相比,“我们的”和“他们的”的含义在变基过程中被交换了。让我解释一下。

我们和他们的合并与 Rebase

当你进行合并时,你总是合并到当前分支;如果发生冲突,“我们的”表示您所在的分支,而“他们的”表示您正在合并的分支。正如您所期望的那样。

变基是不同的。假设您要将名为 local 的分支变基到 master.

        master
        ⌄
o---o---o
    \
     A---B---C ‹ local

在变基期间,Git 创建一种“临时分支”来完成工作1。它首先将 HEAD 移动到您要重新定位的分支的顶端,在本例中为 master:

        master
        ⌄   
o---o---o ‹ HEAD
    \
     A---B---C ‹ local

然后,它 cherry-picks 来自 local 的一次提交:

        master
        ⌄   
o---o---o---A'---B' ‹ HEAD
    \
     A---B---C ‹ local

现在,假设提交 C 有冲突:

        master
        ⌄             X
o---o---o---A'---B'---C' ‹ HEAD
    \
     A---B---C ‹ local

在这种情况下,“ours”表示临时分支 Git 正在处理,而“theirs”是提交 cherry-picked 的分支,即 local .

如果您想在 local 分支中保留更改,则必须选择“他们的”一侧。相反,如果您想保留 master 中的更改,您可以选择“我们的”一方。

冲突解决后,Git 通过移动 local 指向 HEAD 所在的位置来完成变基操作:

        master
        ⌄             
o---o---o---A'---B'---C' ‹ HEAD, local
    \
     A---B---C

鉴于没有分支引用提交 C,这些提交变为 unreachable 并最终将被删除:

        master
        ⌄             
o---o---o---A'---B'---C' ‹ HEAD, local

1它实际上只是一个detached head,但是为了这个解释的目的,你可以把它看作一个临时分支,即使没有分支引用正在创建。