我猜你可能会感到困惑,因为这个问题本来就很令人困惑。更糟糕的是,在进行rebase操作时,整个"ours/theirs"概念会反转(变得相反)。
最终,在git merge
期间,“ours”分支是指你要合并到的分支:
git checkout merge-into-ours
而"theirs"分支是指您正在合并的(单个)分支:
git merge from-theirs
这里的“ours”和“theirs”有一定的意义,因为即使“theirs”可能已经是你的了,“theirs”也不是你在运行git merge
时所在的分支。
尽管使用实际的分支名称可能很酷,但在更复杂的情况下会出现问题。例如,你可能会这样做:
git checkout ours
git merge 1234567
你可以通过原始提交ID合并代码,甚至更糟糕的是,你可以这样做:
git checkout 7777777 # detach HEAD
git merge 1234567 # do a test merge
在这种情况下,没有任何分支名称涉及!
我认为这里帮助不大,但实际上,在gitrevisions
语法中, 在冲突合并期间,您可以通过编号引用索引中的单个路径。
git show :1:README
git show :2:README
git show :3:README
阶段#1是文件的公共祖先,阶段#2是目标分支版本,阶段#3是您正在合并的版本。
“我们的”和“他们的”在rebase
期间交换的原因是,rebase通过进行一系列cherry-pick操作来工作(进入匿名分支(分离的HEAD模式))。目标分支是匿名分支,合并来源分支是您原始的(pre-rebase)分支:所以,“--ours”意味着rebase正在构建的匿名分支,“--theirs”意味着“正在被rebase的我们的分支”。
至于gitattributes条目:它内部实际上是“使用第二个阶段”,因此它可能会产生影响。但是正如您所注意到的,在此之前实际上还没有完成这一点,因此除非您在开始之前将其复制到工作树中,否则它不应该在这里产生影响。
另外,顺便说一下,这适用于所有“我们的”和“他们的”的用法,但有些是基于整个文件的(merge策略的-s ours
;在合并冲突期间的git checkout --ours
),有些是基于逐个片段的(在 -s recursive
合并期间的-X ours
或 -X theirs
)。这可能对任何混淆都没有帮助。
我从未想出更好的名称。另外:请参见VonC的答案以获取有关这些的其他名称,其中git mergetool
引入了更多名称,称其为“本地”和“远程”!
git merge
、git cherry-pick
、git rebase
和git revert
中如何变化。 - Gabriel Staples