为了账号安全,请及时绑定邮箱和手机立即绑定

git中“我们的”和“他们的”的确切含义是什么?

git中“我们的”和“他们的”的确切含义是什么?

Git
收到一只叮咚 2019-11-21 14:31:41
这听起来像是一个问题的基本知识,但是我一直在寻找答案,现在我比以前更加困惑。将我的分支合并到另一个分支时,git中的“我们的”和“他们的”是什么意思?两个分支都是“我们的”。在合并冲突中,“我们的”是否总是显示两个版本中的较高者?“我们的”是否总是指合并开始时HEAD指向的分支?如果是这样,那为什么不使用诸如“当前分支”之类的清晰所有格代词,而不是使用指称性模棱两可的“我们”之类的所有格代词(因为这两个分支在技术上都是我们的)?还是只使用分支名称(而不是说“我们的”,而要说“本地主人的”等)?我最困惑的部分是,如果我在特定分支的.gitattributes文件中指定。可以说在测试分支中,我有以下.gitattributes文件:config.xml merge=ours现在我结帐,将HEAD指向master,然后合并到test中。由于master是我们的主人,并且test的.gitattributes未检出,它甚至会起作用吗?如果确实有效果,那么既然主人现在是我们的,那将会发生什么?
查看完整描述

3 回答

?
蛊毒传说

TA贡献1895条经验 获得超3个赞

我怀疑您在这里感到困惑,因为这从根本上来说是令人困惑的。更糟的是,当您进行基准调整时,我们/他们的整个工作切换角色(倒退)。


最终,在期间git merge,“我们的”分支是指您要合并到的分支:


git checkout merge-into-ours

而“他们的”分支是指您要合并的(单个)分支:


git merge from-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被交换的原因是,通过执行一系列的樱桃操作,将重新建立基础工作到匿名分支(分离的HEAD模式)。目标分支是匿名分支,而merge-from分支是您的原始(重新设置基准)分支:因此,“-我们的”表示正在建立匿名的一个基准,而“-他们的”表示“正在重新建立我们的分支” 。


至于gitattributes条目:它可能会产生影响:“我们的”实际上是在内部表示“使用阶段2”。但是正如您所注意到的,它当时实际上并不存在,因此它应该不会在这里起作用……好吧,除非您在开始之前将其复制到工作树中,否则不会这样做。


另外,顺便说一句,这适用于我们及其使用的所有使用,但是有些是在整个文件级别上(-s ours对于合并策略;git checkout --ours在合并冲突期间),而有些是逐段的(-X ours或-X theirs在-s recursive合并)。这可能无助于解决任何混乱。


不过,我从来没有想出一个更好的名字。并且:请参见VonC对另一个问题的回答,其中git mergetool为它们引入了更多名称,称它们为“本地”和“远程”!


查看完整回答
反对 回复 2019-11-21
  • 3 回答
  • 0 关注
  • 777 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信