我遇到了一个场景,其中我不理解结果。
我的团队正在使用提交记录进行一个功能分支的开发:
A--B--C
一位同事提交了两个新的代码提交:
A--B--C--D--E
我没有意识到有其他人正在将代码推送到这个分支,因此我强制推送了一个修改过的提交:
A--B--C'
在意识到我的错误后,我建议他尝试(在他的仓库中,D和E仍然存在):
git pull -r
git push
我的想法是他的两次提交(D、E)已不再属于该分支的历史记录,所以在拉取时,Git 将试图将它们合并到历史记录中。我预期 D 和 E 将被重新基于 C',但这并没有发生。相反地(引用解释):
$ git pull -r
+ commit...commit branch -> origin/branch (forced update)
$ git push
Everything up-to-date
而且D和E都不见了。我想也许他在他的版本库上做了一些其他的操作,所以它可能处于某种未知状态,因此我们在reflog中找到了E的哈希值,并多次执行git reset --hard <E>
尝试再次操作(主要是因为我很好奇为什么它没有按照我的预期进行),但得到了相同的结果。
我确定我误解了一些事情,但我不知道是什么。为什么git pull -r
没有将“新”的提交D和E(即我无意中从历史记录中删除的提交)在C'之上变基?
正如一些人指出的那样:我的期望应该包括C。我没有考虑到这一点,但我理解为什么,这是有道理的。
我的期望是,“新”的提交(现在更新为C、D、E;即使它能够工作,也不是我想要的)会被变基,但实际上并没有,我不明白为什么。
@matt提到过这些提交之前已经被推送过,这很有趣。如果有人可以详细解释一下这个机制,那似乎是一个潜在的答案。