git pull --rebase通过保留本地更改来解决冲突 我们与他们在合并与重组中的争斗

问题描述

我改行成为本地分支机构的管理员。同时,有人对该远程分支进行了更改。我在做git pull --rebase。对于currentincoming以及ourstheirs的命名,我不理解git如何解释此命令。

我应该选择哪个始终保留本地更改?另外,在我第一次与师傅建立基础之后,还有许多冲突。是否有一条命令可以使git pull --rebase仅保留我的所有本地更改,而不必手动进行?我了解ourstheirs,但是我不知道如何将这些关键字合并到git pull --rebase命令中。

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

解决方法

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

git pull --rebase -X theirs

在直觉上想说“我们的”时,不得不说“他们的”的原因是因为与合并相比,在重组期间“我们的”和“他们的”的含义被交换了。让我解释一下。

我们与他们在合并与重组中的争斗

进行合并时,您总是会合并到当前分支中。如果发生冲突,“我们的”表示您所在的分支,而“他们的”表示您正在合并的分支。完全符合您的预期。

变基有所不同。假设您要将一个名为local的分支重新部署到master上。

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

在重新设置基准期间,Git创建一种“临时分支”来进行工作 1 。首先将HEAD移至要重新建立基础的分支的顶端,在本例中为master

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

然后,它一次从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

在这种情况下,“我们的”表示Git正在使用的临时分支,而“他们的”则是从中挑选提交的分支,即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,但是出于解释的目的,即使没有创建分支引用,您也可以将其视为临时分支。 >