我在本地分支上重新设置为 master。与此同时,有人在远程对这个分支进行了更改。我在做git pull --rebase。我不明白 git 在命名currentandincoming以及oursand时如何解释这个命令theirs。
我应该选择哪个来始终保留我的本地更改?另外,在我第一次与 master 变基后,有几十个冲突。是否有一个命令可以让git pull --rebase我保留所有本地更改,而不必手动执行?我知道oursand theirs,但我不知道如何将这些关键字合并到git pull --rebase命令中。
这些东西令人困惑,因为所有这些关键字都在合并和 rebase 之间颠倒了,然后使用 rebase 拉动以增加额外的混乱。
Enr*_*lio 11
支持本地分支更改的命令是:
git pull --rebase -X theirs
Run Code Online (Sandbox Code Playgroud)
直觉上,当您想说“我们的”时,您必须说“他们的”的原因是因为与合并相比,在变基期间“我们的”和“他们的”的含义交换了。让我解释。
当你进行合并时,你总是合并到当前分支;如果发生冲突,“我们的”表示您所在的分支,而“他们的”表示您要合并的分支。正如您所期望的那样。
变基是不同的。比方说,你重订一个叫分支local上master。
master
?
o---o---o
\
A---B---C ‹ local
Run Code Online (Sandbox Code Playgroud)
在变基期间,Git 创建了一种“临时分支”来完成工作1。它首先移动HEAD到您要重新定位的分支的尖端,在这种情况下master:
master
?
o---o---o ‹ HEAD
\
A---B---C ‹ local
Run Code Online (Sandbox Code Playgroud)
然后,它local一次从一个提交中挑选:
master
?
o---o---o---A'---B' ‹ HEAD
\
A---B---C ‹ local
Run Code Online (Sandbox Code Playgroud)
现在,让我们想象一下提交C有冲突:
master
? X
o---o---o---A'---B'---C' ‹ HEAD
\
A---B---C ‹ local
Run Code Online (Sandbox Code Playgroud)
在这种情况下,"ours" 表示 Git 正在处理的临时分支,而 "irs" 是从中挑选出提交的分支,即 local.
如果您想保留local分支中的更改,则必须选择“他们的”一侧。相反,如果您想保留 中的更改master,您会选择“我们的”一侧。
一旦冲突得到解决,Git 通过移动local到指向 where HEADis来完成 rebase 操作:
master
?
o---o---o---A'---B'---C' ‹ HEAD, local
\
A---B---C
Run Code Online (Sandbox Code Playgroud)
鉴于没有分支引用 commit C,这些提交变得无法访问并最终将被删除:
master
?
o---o---o---A'---B'---C' ‹ HEAD, local
Run Code Online (Sandbox Code Playgroud)
1它实际上只是一个分离的 head,但出于本说明的目的,您可以将其视为一个临时分支,即使没有创建分支引用。