git checkout:“他们的”和“我们的”的详细含义

Posted

技术标签:

【中文标题】git checkout:“他们的”和“我们的”的详细含义【英文标题】:git checkout: detailed meaning of "theirs" and "ours" 【发布时间】:2016-03-19 12:13:27 【问题描述】:

git checkout documentation 说:

--我们的 --他们的 从索引中检查路径时,请检查阶段 #2 (ours) 或 #3 (theirs) 以获取未合并的路径。

在合并、变基和cherry-pick期间,“stage #2”和“stage #3”是什么意思?有没有办法在运行命令之前查询这些“阶段”以确保它会检索到正确的版本?

【问题讨论】:

【参考方案1】:

这些都记录在the gitrevisions documentation:

一个冒号(可选地后跟一个阶段号(0 到 3)和一个冒号,后跟一个路径,在给定路径的索引中命名一个 blob 对象。缺少的阶段编号(及其后面的冒号)命名阶段 0 条目。在合并期间,阶段 1 是共同祖先,阶段 2 是目标分支的版本(通常是当前分支),阶段 3 是正在合并的分支的版本。

然后,您需要添加有关 git rebasegit cherry-pick 工作原理的知识。

正常的樱桃采摘是明确定义的:“我们的”是HEAD 版本,即您曾经(现在仍然是)所在的分支,而“他们的”是您正在积极采摘的提交。当您选择单个提交时,一切都很明显:阶段 #1 是所谓的共同祖先提交,1 阶段 #2 是当前分支尖端的版本,阶段#3 是您选择的版本。

如果您选择一系列提交,这仍然是正确的,它只是迭代地正确。例如,假设您正在挑选三个提交。 Git 一次只做三个。在第一次cherry-pick 期间,stage #2 是您分支的尖端,stage #3 是从第一次提交开始的版本。一旦提交 cherry-pick 完成,git 会进行新的提交,从而推进分支的尖端。然后,在第二次 cherry-pick 期间,stage #2 是您分支的尖端,这是您第一次 cherry-pick 所做的提交,stage #3 是第二次被挑选的提交的版本。对于最终提交,这再次重复。每次,第 3 阶段都是“他们的”版本。

然而,Rebase 有点棘手。在内部,它首先让您进入一个新的匿名分支(“分离的 HEAD”)。然后它运行git cherry-pick 以从您的原始分支中选择每个提交。这意味着“我们的”是分离的 HEAD 版本,而“他们的”是原始分支的版本。就像cherry-pick 一样,对于要选择的每个提交,这都会迭代重复(字面意思是在交互式rebase 的情况下,您编辑pick 行)。一旦 rebase 完成,git 会简单地打乱分支标签,这样你刚刚创建的新匿名分支就是你的代码。

简而言之,您可以将 rebase 视为“反转我们/他们的设置”——但这是夸大其词。更准确的说法可能是第 2 阶段是您的新融合代码,而第 3 阶段是您的旧代码。


Stage #1 定义的合并基础。对于真正的合并,这是最好的共同祖先提交,但cherry-pick 将其强制提交给正在挑选的提交的父级。 (Revert 以类似的方式工作,只是被“复制”的提交是父提交,而“合并基”是被恢复的提交。)

【讨论】:

您在挑选单个提交时说“第 1 阶段是共同的祖先”。我认为这是错误的。阶段 #1 是您正在挑选的提交的父级。 @wds:是的,第 1 阶段是合并基础,它确实是为樱桃挑选而挑选的提交的父级。我会解决的。 您对为什么变基“我们的”和“他们的”与直观含义相反的描述很棒。我仍然认为 git 维护者选择的术语很糟糕而且令人困惑,但至少通过你的解释我可以理解。【参考方案2】:

Git documentation for merge(以及其他一些地方)解释说索引文件最多记录三个版本或阶段:

对于冲突的路径,索引文件最多记录三个版本:阶段 1 存储来自共同祖先的版本,阶段 2 来自 HEAD,阶段 3 来自 MERGE_HEAD(您可以使用 git ls-files -u 检查阶段) .工作树文件包含“合并”程序的结果;即 3 路合并结果与熟悉的冲突标记 >>.

这是一个图表,显示了典型 Git 合并中的三个阶段:

Common Ancestor -> C1  --- C2         <- MERGE_HEAD (Stage 3)
(Stage 1)             \
                        --- C3 --- C4 <- HEAD (Stage 2)

这假设HEADC4 的分支正在合并回以C2 结尾的分支。

正如文档所述,您实际上可以通过键入以下内容来查看阶段:

git ls-files -u

【讨论】:

以上是关于git checkout:“他们的”和“我们的”的详细含义的主要内容,如果未能解决你的问题,请参考以下文章

从 *** 中的远程仓库进行 Git Checkout [关闭]

git中reset和checkout的总结整理

【Git】checkout 用法总结

git checkout .和git checkout -f的区别;git add . git add -u git add -A的区别

git checkout .和git checkout -f的区别;git add . git add -u git add -A的区别

git checkout与git reset有什么区别吗