在“git rebase --onto”之后<upstream>和<branch>之间的原始提交会发生什么?</branch> </upstream>

时间:2013-04-24 13:41:12

标签: git

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

...,因此,“删除FG”。

但实际上我并没有看到第一个和第二个例子之间存在很大差异:

        H---I topicA
       /
  F---G topicA~3
 /
E topicA~5

所以结果应该更像

 H'--I'--J'  topicB
/
| F---G  
|/
E

FG仍然存在或是否真的被删除了?至少gitk向我显示FG,甚至是HIJ。这是无法访问的提交吗?一段时间后他们会被“垃圾收集”吗?或者我的磁盘上会永远存在(甚至推到遥控器上)。这可以应用于第一个例子吗? HIJ仍在那里吗?

2 个答案:

答案 0 :(得分:2)

它们不会被删除,提交仍然存在,如果你知道提交,你可以检查它们,标记它们,创建一个分支等.git reflog命令可以帮助找到它们。

如果没有提到他们,他们最终将被垃圾收集。 This页面会告诉您更多相关信息。默认情况下,它是在90天后。

答案 1 :(得分:1)

原来的E---F---G---H---I---J 所有之后仍然存在。重新定位不能改变任何东西。可以想象它更像是为rebase下的每个提交生成一个补丁,然后将其应用于创建时的新分支。 FG未被删除;在G之上重播从HE的更改,创建H'。然后,在新H之上重播从IH'的更改,创建I'。最后,分支 - 它只是一个指针 - 被重新命名为J',原始分支从视图中消失,因为现在没有任何部分指向它。