- 我们的 的 - 他们 检查索引中的路径时,请查看阶段#2(我们的)或#3(他们的)中的未合并路径。
在合并,rebase和cherry-pick期间,“阶段#2”和“阶段#3”的含义是什么?有没有办法在运行命令之前查询这些“阶段”以确保它将检索正确的版本?
答案 0 :(得分:5)
the gitrevisions
documentation中记录了这些内容(尽管不是很明显):
冒号,可选地后跟阶段编号(0到3)和冒号,后跟路径,在给定路径的索引中命名blob对象。缺少的阶段编号(以及其后面的冒号)命名阶段0条目。在合并期间,阶段1是共同的祖先,阶段2是目标分支的版本(通常是当前分支),阶段3是正在合并的分支的版本。
然后,您需要添加有关git rebase
和git 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)
这假设HEAD
为C4
的分支正在合并回到以C2
结尾的分支。
正如文档所述,您可以通过键入以下内容来实际查看阶段:
git ls-files -u