所以,我在Github上分叉了一个项目,并做了2次提交。我也将这些提交推送到我的分支。
与此同时,上游项目也有2次提交。
让我们说在分叉时,两个分支都在头部A
A
我做了两次提交B和C并将它们推入我的叉子
A - B - C
和上游提交D和E
A - D - E
在我的fork的克隆回购中,我是从上游获取的,所以状态是
A - D - E
\
B - C
然后我做了一个rebase,把状态带到了
A - D - E
\
B - C - D' - E'
现在,我想把它放在我的叉子里,这样D和E就不存在了,头部也在E'。我是唯一一个使用我的叉子的人。
我在这里检查了其他几个答案,我没有看到任何有多头问题(E和E')的问题。
答案 0 :(得分:3)
你遗漏的照片是 refs - 分支和标签(以及远程分支引用,以及其他一些内容)。
当您进行rebase时,如果您检出了分支(或指定在rebase的开头检查分支),则默认行为是将签出的分支ref移动到重写的提交。原始提交始终存在;但如果没有引用仍指向它们,则默认日志输出将不会显示它们。
然而,一个ref肯定仍指向他们:你重写的分支的远程分支ref。将更新推送到原点时,将更正此问题。这必须是“强制”推送(git push -f
),但因为您是回购的唯一用户并不重要。
如果其他分支仍然指向原始提交,您可以使用git reset
将它们移动到新提交。
git checkout branch
git reset <new-commit-id>
如果分支指向可从其访问原始提交的其他提交,则还必须重写这些提交。这是一个更大的话题,请告知我们是否适用。
与标签类似,如果他们指向原始提交,您可以移动它们(git tag -f ...
)。
答案 1 :(得分:0)
正如你所提到的 - 你的叉子分支 - 让我们称之为&#39; Origin&#39;在A-B-C-状态(假设它推向你的原点),
现在主分支(称之为&#39;上游&#39;)ADE几乎没有变化,所以你必须做的是,从上游提取代码,如果你使用的是Eclipse /或Local,你将得到你的代码(ABC ++ DE)如果您没有任何冲突,请将其推送到您的Origin分支,这样您的回购将处于同步&amp;那么你也可以为你的更改提出拉取请求,这是B-C,
现在你的上游是主分支,你的Origin是分叉分支是偶数。