当前位置: 首页 > 知识库问答 >
问题:

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

唐声
2023-03-14

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

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

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

“我们的”是否总是指合并开始时HEAD指向的分支?如果是这样的话,为什么不使用像“current branch's”这样清晰的所有格指称,而不是使用像“ours”这样在指称上模棱两可的所有格代词(因为两个分支在技术上都是我们的)?

或者只是使用分支名称(而不是说“我们的”,只是说“当地硕士的”或诸如此类的)?

对我来说,最令人困惑的是,如果我在一个特定分支的。gitattributes文件。假设在测试分支中,我有以下内容。gitattributes文件:

config.xml merge=ours

现在我签出并指向主HEAD,然后在测试中合并。既然master是我们的,而test的. git属性没有签出,它会有效果吗?如果它确实有效果,既然师父现在是“我们的”,那么会发生什么?

共有3个答案

洪飞驰
2023-03-14

Git中的“我们的”是指原始的工作分支,它具有Git历史的权威/规范部分。

他们的版本指的是保存工作以便重设基础的版本(更改将重放到当前分支上)。

这可能会被交换到那些没有意识到进行重设(例如git rebase)实际上是暂停你的工作(这是他们的)以便重放到我们的规范/主要历史上的人,因为我们正在重设我们的更改为第三方工作。

git中进一步澄清了git签出的git签出的文档

--我们的--他们的

从索引中检出路径时,请检出未合并路径的第2阶段('our')或第3阶段('他们的')。

请注意,在git rebasegit拉--rebase期间,我们的和他们的可能会出现互换;--our从分支中给出更改的版本,而-他们的给出保存正在重设基础的工作的分支的版本。

这是因为rebase在工作流中使用,该工作流将远程的历史记录视为共享的规范历史记录,并将在要重定基础的分支上完成的工作视为要集成的第三方工作,并且在重定基础期间,您临时担任规范历史记录的保管人。作为规范历史的保管者,您需要从远程将历史视为我们的(即“我们共享的规范历史”),而您在您的分支上所做的则是他们的(即“一个贡献者的工作”)。

对于git-合并,可以通过以下方式进行解释:

我们的

此选项通过支持我们的版本,强制自动干净地解决冲突大块。来自另一棵树的与我方不冲突的更改将反映到合并结果中。对于二进制文件,所有内容都取自我们这边。

这不应该与我们的合并策略相混淆,我们的合并策略甚至根本不看另一棵树包含什么。它丢弃了其他树所做的一切,声明我们的历史包含其中发生的一切。

他们的

这与我们的相反。

此外,这里解释了如何使用它们:

合并机制(git mergegit pull命令)允许使用-s选项选择后端合并策略。一些策略也可以采用自己的选项,可以通过给出-X来传递

因此,有时可能会令人困惑,例如:

  • git拉源主其中-Xour是我们的本地,-Xtheir是他们的(远程)分支
  • git拉原点主-r其中-Xour是他们的(远程),-Xtheir是我们的

所以第二个例子与第一个相反,因为我们在远程分支上重定分支的位置,所以我们的起点是远程分支,我们的更改被视为外部更改。

类似于git合并策略(-X我们的-X他们的)。

郭瀚海
2023-03-14

我知道这个问题已经得到了回答,但是这个问题让我困惑了很多次,我建立了一个小的参考网站来帮助我记住:https://nitaym.github.io/ourstheirs/

以下是基本知识:

$ git checkout master 
$ git merge feature

如果要在master中选择版本:

$ git checkout --ours codefile.js

如果要在特性中选择版本:

$ git checkout --theirs codefile.js
$ git checkout feature 
$ git rebase master 

如果要在master中选择版本:

$ git checkout --ours codefile.js

如果要在特性中选择版本:

$ git checkout --theirs codefile.js

(当然,这是完整的文件)

柯振濂
2023-03-14

我怀疑你在这里感到困惑,因为它从根本上说是令人困惑的。更糟糕的是,当你在做一个重基时,我们/他们的东西都会转换角色(变得向后)。

最终,在git合并期间,我们的分支指的是您正在合并到的分支:

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

在这种情况下,没有分支机构的名称涉及!

我认为它在这里没有什么帮助,但事实上,在git修订语法中,您可以在冲突合并期间按数字引用索引中的单个路径

git show :1:README
git show :2:README
git show :3:README

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

rebase期间,我们的和他们的概念被交换的原因是rebase通过执行一系列选择来工作,进入匿名分支(分离的HEAD模式)。目标分支是匿名分支,合并自分支是您的原始(预rebase)分支:因此"--our"表示正在构建的匿名一个rebase,而"--her"表示"我们的分支正在重设"。

至于git属性条目:它可能会有一个效果:“我们的”实际上意味着“在内部使用第二阶段”。但是正如你所注意到的,它当时实际上还没有到位,所以它在这里不应该有效果...除非你在开始之前将其复制到工作树中。

顺便说一句,这适用于我们和他们的所有用途,但有些是在整个文件级别上的(-s ours用于合并策略;git checkout--ours在合并冲突期间),有些是逐件的(-X ours-X ours-s递归合并期间)。这可能无助于解决任何困惑。

不过,我从来没有想到过比这更好的名字。还有:请看VonC对另一个问题的回答,git mergetool为这些工具引入了更多的名称,称它们为“本地”和“远程”!

 类似资料:
  • 这两天我一直在和Git Bash合作。我现在知道了诸如、、、和等基本操作。但我还是不知道Git Bash本身到底是什么! 我已经搜索了很多关于Git Bash的内容,但是我看到的所有站点都集中在它的命令的功能上。我仍然没有为我的问题找到一个好的答案。现在,我想,我在正确的地方得到这个答案!

  • (...)当您在非托管环境中使用JmsTemplate时,您可以通过使用属性SessionTransact和SessionAccountingEmode来指定这些值(事务和确认模式)。 当您将PlatformTransactionManager与JmsTemplate一起使用时,模板总是被赋予一个事务性JMS会话。(..) (顺便说一句,这是真的--会话是事务性的) 我调试了它不正确的原因,发现:

  • 问题内容: 我是JAVA的新手,因此遇到了这个词。“在方法内部创建的类,在Java中称为本地内部类。如果要调用本地内部类的方法,则必须在方法内部 实例化 该类”。粗体字。任何人都可以帮我解决这个问题。我知道这很尴尬,我应该做更多的研究,但我只是不明白。谢谢。 问题答案: 首先 声明的意思是 : 实例化的 简单含义 是从class创建一个对象 。 什么是物体? 类的实例。从一个类中,我们可以创建许多

  • 问题内容: 我想在同一类对象的各种实例之间共享一个对象。 从概念上讲,在我的程序运行时,类A的所有对象都访问类B的相同对象。 我已经看到这是系统范围的,不鼓励使用它。这是否意味着如果我在实例化类A的对象的同一JVM上运行另一个程序,则这些对象可能会访问与先前程序中访问的对象相同的B对象? 使用静态字段的一般缺陷是什么? 是否有其他选择(不需要大量的实施工作)? 问题答案: 静态不是完全意味着“由所

  • 我在网上搜索了“Gradle classpath site:stackoverflow.com”和“Gradle classpath”,只在以下文件中找到相关信息: Gradle:What is the difference between classpath and compile dependencies? 余登宝的回答是这样写的: 编译'org.hibernate:hibernate-cor

  • 问题内容: 我在Oracle过程中使用诸如“ where 0 =0”之类的语句时有些困惑?有人可以澄清一下吗?即使我们进行动态选择,即使在查询中附加了实际条件,为什么还要添加此语句呢?条件会否影响结果集?..我经历了如何选择列包含字符串中任何单词的所有行?但我完全理解使用“ where 0= 0”的原因。有人可以给我使用这种条件的正确理由吗? 提前致谢..;) 问题答案: 使用动态sql时,可能需