-1

我有分支说“实验”,它被推了几天。现在,master 已经更新,我需要在 rebase 到 master 后再次推送实验。但是当我将它变基为 master 时,我看不到 master 之上的实验补丁。我的实验分支指向 master。

有什么问题?会不会是这个实验分支已经和master合并了还是别的什么?

Git状态

$ git status
在分支实验
上 未跟踪的文件:(
使用“git add ...”来包含将提交的内容)
a.txt
没有添加到提交但存在未跟踪的文件(使用“git add”进行跟踪)

Git 日志

$ git log
Experiment commit bc6c71d5ec6d8798aa283c9feaec844cd03edc60
作者:ssrivastava
日期:Tue Nov 27 12:15:37 2012 +0530
[experiment] 为玩家状态添加索引

在 rebase 到 master

首先,倒带头在上面重播你的工作......
快进实验掌握。

通常在应用 rebase 时,它​​会在基础分支之上应用当前分支的最新更改,但我在这里看不到任何东西。

4

1 回答 1

1

一般来说,在变基时,Git 足够聪明,可以检测到哪些提交什么都不做并将它们排除在外。因此,当您在 master 中进行与实验分支中的提交执行相同操作的更改时,该提交将被跳过,因为它不会改变任何内容。虽然在审查 rebase 时这种行为可能会令人困惑,但在您的情况下并非如此。

变基通过找到两个分支的共同祖先来工作;然后将其用作旧基地。在您的情况下,由于您已将实验分支的更改合并主分支中,因此共同的祖先是合并提交。现在提交与 master 此刻指向的相同,它实际上是实验分支的子节点(在合并之前指向实验分支中的父节点):

B --- * --- O --- M       B ~ old base, O ~ old master
 \               /        M ~ current master (the merge commit)
  * --- * ----- E         E ~ experiment branch

所以 master 已经包含了完整的实验分支,而 M 实际上领先于实验分支一个提交。如果 Git 现在在 master 之上重放实验分支中的提交,它会跳过这些提交,因为它们是空的——所有的更改都已经在 master 中了。所以基本上它会以快进结束。现在,由于 Git 很聪明,它不需要尝试在 master 之上应用所有这些提交来查看它们都会被跳过。由于 master 领先于实验分支,因此总是如此。所以它可以直接将实验分支快进到master。

于 2012-12-12T07:29:03.947 回答