这听起来可能是一个太基本的问题,但我已经搜索了答案,现在比以前更加困惑。

将我的分支 merge 到另一个分支时,git 中的“我们的”和“他们的”是什么意思?
两个分支都是“我们的”。

在 merge 冲突中,“我们的”总是显示的两个版本中的上一个吗?

“ours”是否总是指 merge 开始时 HEAD 指向的分支?如果是这样,那么为什么不使用像“current branch's”这样的明确的所有格引用,而不是使用像“ours”这样的所有格代词,它在指称上不明确(因为两个分支在技术上都是我们的)?

或者只是使用分支名称(而不是说“我们的”,而只是说“本地大师的”之类的)?

对我来说最令人困惑的部分是我是否在特定分支的 .gitattributes 文件中指定。让我们说在 测试分支 我有以下 .gitattributes 文件:

config.xml merge=ours

现在我结帐并将 HEAD 指向 master 然后 merge 到 test 。由于 master 是我们的, test 的 .gitattributes 没有检查出来,会不会有效果?如果它确实有效果,既然 master 现在是“我们的”,那么会发生什么?

最佳答案

我怀疑您在这里感到困惑,因为它从根本上令人困惑。更糟糕的是,当您进行 rebase 时,整个我们/他们的东西都会转换角色(变得倒退)。

最终,在 git merge 期间,“ours”分支指的是您要 merge 到的分支:

git checkout merge-into-ours

并且“他们的”分支指的是您要 merge 的(单个)分支:
git merge from-theirs

在这里,“我们的”和“他们的”是有道理的,尽管“他们的”可能是你的,但“他们的”并不是你在运行 git merge 时所在的那个。

虽然使用实际的分支名称可能很酷,但在更复杂的情况下它会崩溃。例如,您可以执行以下操作,而不是:
git checkout ours
git merge 1234567

您正在通过原始提交 ID merge 的位置。更糟糕的是,您甚至可以这样做:
git checkout 7777777    # detach HEAD
git merge 1234567       # do a test merge

在这种情况下,不涉及分支名称!

我认为这在这里没什么帮助,但实际上,在 gitrevisions syntax 中,您可以在冲突 merge 期间按编号引用索引中的单个路径
git show :1:README
git show :2:README
git show :3:README

第 1 阶段是文件的共同祖先,第 2 阶段是目标分支版本,第 3 阶段是您要从中 merge 的版本。

rebase 期间“我们的”和“他们的”概念被交换的原因是 rebase 通过对匿名分支(分离的 HEAD 模式)进行一系列挑选来工作。目标分支是匿名分支,merge-from 分支是你原来的(re-rebase 前)分支:所以“--ours”意味着匿名一个 rebase 正在构建,而“--theirs”意味着“我们的分支正在rebase” .

至于 gitattributes 条目:它可能会产生影响:“我们的”在内部实际上意味着“使用第 2 阶段”。但正如您所注意到的,当时它实际上并没有到位,所以它不应该在这里产生影响......好吧,除非您在开始之前将其复制到工作树中。

此外,顺便说一下,这适用于我们和他们的所有用途,但有些是在整个文件级别(-s ours 表示 merge 策略;git checkout --ours 在 merge 冲突期间),有些是逐个的(0x25181314131或 -X ours merge 期间的 -X theirs)。这可能无助于任何困惑。

不过,我从来没有想出更好的名字。并且:参见 VonC's answer 到另一个问题,其中 -s recursive 为这些引入了更多名称,称它们为“本地”和“远程”!

关于git - git 中 "ours"和 "theirs"的确切含义是什么?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/25576415/

10-15 02:34