在git man page for rebase上,您可以找到一个重新定位分支的示例。
H---I---J topicB
/
E---F---G topicA
/
A---B---C---D master
命令git rebase --onto master topicA topicB
会产生......
H'--I'--J' topicB
/
| E---F---G topicA
|/
A---B---C---D master
......据我所知,这是相当合理的。不幸的是,下一个例子显示了不同的输出基本上它描述了如何使用rebasing来删除提交:
E---F---G---H---I---J topicA
根据调用git rebase --onto topicA~5 topicA~3 topicA
的手册页会产生...
E---H'---I'---J' topicA
...,因此,“删除F
和G
”。
但实际上我并没有看到第一个和第二个例子之间存在很大差异:
H---I topicA
/
F---G topicA~3
/
E topicA~5
所以结果应该更像
H'--I'--J' topicB
/
| F---G
|/
E
F
和G
仍然存在或是否真的被删除了?至少gitk
向我显示F
和G
,甚至是H
,I
和J
。这是无法访问的提交吗?一段时间后他们会被“垃圾收集”吗?或者我的磁盘上会永远存在(甚至推到遥控器上)。这可以应用于第一个例子吗? H
,I
和J
仍在那里吗?
答案 0 :(得分:2)
它们不会被删除,提交仍然存在,如果你知道提交,你可以检查它们,标记它们,创建一个分支等.git reflog命令可以帮助找到它们。
如果没有提到他们,他们最终将被垃圾收集。 This页面会告诉您更多相关信息。默认情况下,它是在90天后。
答案 1 :(得分:1)
原来的E---F---G---H---I---J
所有之后仍然存在。重新定位不能改变任何东西。可以想象它更像是为rebase下的每个提交生成一个补丁,然后将其应用于创建时的新分支。 F
和G
未被删除;在G
之上重播从H
到E
的更改,创建H'
。然后,在新H
之上重播从I
到H'
的更改,创建I'
。最后,分支 - 它只是一个指针 - 被重新命名为J'
,原始分支从视图中消失,因为现在没有任何部分指向它。