首页 > 解决方案 > git pull --rebase 通过保留本地更改来解决冲突

问题描述

我重新定位到我当地的分支机构。同时,有人在远程对这个分支进行了更改。我在做git pull --rebase。我不明白 git 在命名currentand时如何解释这个命令incoming,以及oursand theirs

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

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

标签: gitrebasepull

解决方案


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

git pull --rebase -X theirs

当直觉上你想说“我们的”时,你必须说“他们的”的原因是因为与合并相比,“我们的”和“他们的”的含义在变基期间交换了。让我解释。

我们和他们的合并与变基

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

变基是不同的。假设您正在重新设置一个名为 on 的local分支master

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

在 rebase 期间,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

在这种情况下,“ours”表示 Git 正在处理的临时分支,而“theirs”是从其中挑选提交的分支,即local.

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

解决冲突后,Git 通过移动local到指向 where HEADis 来完成 rebase 操作:

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

鉴于没有留下引用 commit 的分支C,这些提交将变得无法访问并最终将被删除:

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

1它实际上只是一个分离的 head,但出于解释的目的,您可以将其视为临时分支,即使没有创建分支引用。


推荐阅读