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

11

我在本地分支上进行了与主分支的变基操作。同时,远程分支上有人对该分支进行了更改。我正在执行 git pull --rebase 命令。我不明白 git 在处理 current、incoming、ours 和 theirs 这些命名时如何解释这个命令。

为了始终保留我的本地更改,我应该选择哪一个?而且,在第一次与主分支进行变基后,出现了数十个冲突。是否有一种命令可以让 git pull --rebase 只保留我所有的本地更改,而不需要手动操作?我知道我们可以使用 ours 和 theirs,但我不知道如何在 git pull --rebase 命令中加入这些关键字。

所有这些关键字在合并和变基之间都相互混淆,然后出现了带有变基的 pull,使事情更加混乱。


3
对于git pull --rebase命令,若要保留“我”的更改,请使用git pull --rebase -Xtheirs。对于没有使用--rebase选项的git pull命令,若要保留“我”的更改,请使用git pull -Xours - ElpieKay
1个回答

31

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

git pull --rebase -X theirs

为什么你想说“ours”,却必须说“theirs”呢?这是因为在rebase和merge时,“ours”和“theirs”的含义被交换了。让我解释一下。

合并和变基中的Ours和Theirs

当你进行合并操作时,你总是将其合并到当前分支;如果存在冲突,“ours”表示你所在的分支,而“theirs”则表示你正在合并的分支。这恰好符合你的预期。

而在变基操作中,则有所不同。假设你正在将名为local的分支变基到master分支。

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

在 rebase 过程中,Git 会创建一种类似于“临时分支”的东西来完成工作1。 它首先将 HEAD 移动到您正在 rebase 到的分支的末端,即这里的 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分支中,则必须选择“theirs”一侧。相反,如果您想要将更改保留在master中,则应选择“ours”一侧。

一旦冲突得到解决,Git通过将local移动到HEAD的位置来完成rebase操作:

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

假设没有分支引用提交C,那些提交就会变成不可达,并最终被删除:

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

1实际上这只是一个分离头指针,但为了方便解释,你可以将其视为一个临时分支,尽管并没有创建任何分支引用。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接