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

时间:2015-12-14 04:35:25

标签: git version-control merge git-branch branching-and-merging

git checkout documentation说:

  

- 我们的   的 - 他们   检查索引中的路径时,请查看阶段#2(我们的)或#3(他们的)中的未合并路径。

在合并,rebase和cherry-pick期间,“阶段#2”和“阶段#3”的含义是什么?有没有办法在运行命令之前查询这些“阶段”以确保它将检索正确的版本?

2 个答案:

答案 0 :(得分:5)

the gitrevisions documentation中记录了这些内容(尽管不是很明显):

  

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

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

正常的樱桃采摘定义明确:"我们的"是HEAD版本,即您(并且仍在)的分支,而"他们的"是你正在积极挑选的提交。当你挑选一个提交时,它非常明显:第一阶段是共同的祖先,阶段#2是你当前分支的尖端版本,阶段#3是你的版本#39重新采摘。

如果你选择了一系列提交,这仍然是正确的,它只是反复进行。例如,假设您正在挑选三个提交。 Git只是一次一个地做三个。在第一次樱桃挑选期间,阶段#2是你的分支的尖端,阶段#3是第一次提交樱桃挑选的版本。一旦提交完成后,git就会进行新的提交,推进你的分支的提示。然后,在第二个樱桃选择期间,阶段#2是你的分支的尖端,这是你的第一个樱桃选择的提交,而阶段#3是从第二个提交被挑选的版本。对于最终提交,这再次重复。每一次,阶段#3都是"他们的"版本

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

简而言之,你可以将rebase视为"扭转我们/他们的设置" - 但这是夸大其词。可以更准确地说第2阶段是新的融合代码,第3阶段是您的旧代码。

答案 1 :(得分:3)

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

  

对于冲突路径,索引文件最多可记录三个版本:阶段1存储来自共同祖先的版本,来自HEAD的阶段2和来自MERGE_HEAD的阶段3(您可以使用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