我有以下Git历史记录:
D-E-A-B-C-A-B-C (feature2)
/
*-D-E (feature1)
/
*-F (develop)
我不知道A,B和C是如何两次在feature2上结束的。我一直在使用git rebase feature1
和git rebase --onto develop feature1
为feature1打开和关闭feature2。我已经通过挑选A,B和C对一个新鲜的分支进行纠正来纠正这种情况,但是:这怎么可能发生呢?我很难过。
我不知道 Github在这里做了什么,但现在Git说:
Your branch and 'origin/feature2-fresh' have diverged,
and have 113 and 100 different commit(s) each, respectively.
所以看来这是Github的错?
答案 0 :(得分:4)
以下是发生的事情:
feature2
重新定位到feature1
。 feature2
重新加入develop
。 feature2
,然后意识到还有更多工作要做,所以rebase再次跳舞(feature1
需要运行feature2
)。 现在,feature2
独有的所有提交的SHA-1与origin/feature2
上的相应提交不同。
没有意识到,我做了pull
。 Git尽职尽责地合并所有提交,因为它们有不同的SHA。这个故事的寓意是:
答案 1 :(得分:1)
一种可能性:
重复提交可以成为git cherry-pick
的标志(请参阅“git - what is cherry-pick?”和its duplicate commit issue)。
如果在rebase之后的任何时候对A和B进行挑选,则可以将它们添加到feature2中,即使该分支已经包含A和B(具有不同的SHA1)。
如果在 rebase之前选择A和B ,那么A和B不应该重复(来自git rebase
man page)
如果上游分支已经包含您所做的更改(例如,因为您邮寄了上游应用的补丁),那么将跳过该提交。