TL;DR;
总结一下(如Benubirdcomments),当:
git checkout A
git rebase B # rebase A on top of B
-
local 是 B (rebase onto),
-
remote 是 A
还有:
git checkout A
git merge B # merge B into A
-
local 是A(合并到),
-
remote 是 B
一个变基切换ours(变基开始之前的当前分支)和theirs(你想要变基的分支)。
kutschkem 指出,在 GUI 合并工具上下文中:
-
本地引用了部分改基的提交:“
ours”(上游分支)
-
remote 指的是传入的更改:“
theirs” - 变基之前的当前分支。
请参阅此答案最后部分的插图。
变基时反转
混淆可能与inversion of ours and theirs during a rebase有关。
(相关摘录)
git rebase man page:
请注意,rebase 合并通过在 <upstream> 分支之上的工作分支重放每个提交来工作。
因此,当发生合并冲突时:
- 报告为“
ours”的一侧是迄今为止的改版系列,以<upstream> 开头,
- 和 '
theirs' 是工作分支。
换句话说,双方互换了。
倒装说明
在合并中
x--x--x--x--x(*) <- current branch B ('*'=HEAD)
\
\
\--y--y--y <- other branch to merge
,我们不会更改当前分支“B”,所以我们所拥有的仍然是我们正在处理的(并且我们从另一个分支合并)
x--x--x--x--x---------o(*) MERGE, still on branch B
\ ^ /
\ ours /
\ /
--y--y--y--/
^
their
在变基上:
但是在变基上,我们切换到一边,因为变基所做的第一件事就是检查上游分支! (在其之上重播当前提交)
x--x--x--x--x(*) <- current branch B
\
\
\--y--y--y <- upstream branch
A git rebase upstream 将首先将 B 的 HEAD 更改为上游分支 HEAD (因此与之前的“当前”工作分支相比,“我们的”和“他们的”的切换.)
x--x--x--x--x <- former "current" branch, new "theirs"
\
\
\--y--y--y(*) <- upstream branch with B reset on it,
new "ours", to replay x's on it
,然后 rebase 将在新的“我们的”B 分支上重放“他们的”提交:
x--x..x..x..x <- old "theirs" commits, now "ghosts", available through reflogs
\
\
\--y--y--y--x'--x'--x'(*) <- branch B with HEAD updated ("ours")
^
|
upstream branch
注意:"upstream" notion 是数据的参考集(一个所有 repo 或像这里一样,一个分支,它可以是一个 local 分支)从中读取数据或新的数据添加/创建数据。
'local'和'remote'与'mine'和'theirs'
Pandawood 加入the comments:
对我来说,问题仍然存在,即“本地”和“远程”谁(因为在 git 中重新定位时不使用“我们的”和“他们的”这两个术语,引用它们似乎只是一个答案更混乱)。
GUI git 合并工具
kutschkem 补充道,这是正确的:
当解决冲突时,git 会这样说:
local: modified file and remote: modified file.
我很确定这个问题目前针对的是本地和远程的定义。那时,根据我的经验,在我看来:
-
本地引用了部分改基的提交:“
ours”(上游分支)
-
remote 指的是传入的更改:“
theirs” - 变基之前的当前分支。
git mergetool 确实提到了“本地”和“远程”:
Merging:
f.txt
Normal merge conflict for 'f.txt':
{local}: modified file
{remote}: modified file
Hit return to start merge resolution tool (kdiff3):
例如,KDiff3 将是 display the merge resolution like so:
而meld 将是display it too:
VimDiff、which displays 相同:
使用 git mergetool -t gvimdiff 调用 Vimdiff 作为合并工具。最新版本的 Git 使用以下窗口布局调用 Vimdiff:
+--------------------------------+
| LOCAL | BASE | REMOTE |
+--------------------------------+
| MERGED |
+--------------------------------+
-
LOCAL:
包含当前分支上文件内容的临时文件。
-
BASE:
包含合并的公共基础的临时文件。
-
REMOTE:
包含要合并的文件内容的临时文件。
-
MERGED:
包含冲突标记的文件。
Git 已尽可能多地执行自动冲突解决,并且此文件的状态是 LOCAL 和 REMOTE 的组合,其中包含 Git 无法自行解决的任何内容的冲突标记。
mergetool 应将解析结果写入此文件。