git pull --rebase 通过保留本地更改来解决冲突
git pull --rebase resolve conflicts by keeping local changes
我重新定位到我当地的分支机构。与此同时,有人在远程对该分支进行了更改。我正在做 git pull --rebase
。在current
和incoming
以及ours
和theirs
的命名方面,我不明白git如何解释这个命令。
我应该选择哪个来始终保留我的本地更改?此外,在我第一次与 master 进行 rebase 之后,出现了数十次冲突。是否有命令让 git pull --rebase
只保留我所有的本地更改,而不必手动执行?我知道 ours
和 theirs
,但我不知道如何将这些关键字合并到 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,但是为了这个解释的目的,你可以把它看作一个临时分支,即使没有分支引用正在创建。
我重新定位到我当地的分支机构。与此同时,有人在远程对该分支进行了更改。我正在做 git pull --rebase
。在current
和incoming
以及ours
和theirs
的命名方面,我不明白git如何解释这个命令。
我应该选择哪个来始终保留我的本地更改?此外,在我第一次与 master 进行 rebase 之后,出现了数十次冲突。是否有命令让 git pull --rebase
只保留我所有的本地更改,而不必手动执行?我知道 ours
和 theirs
,但我不知道如何将这些关键字合并到 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,但是为了这个解释的目的,你可以把它看作一个临时分支,即使没有分支引用正在创建。