让我们解决这个问题。
有 3 个存储库:您的本地克隆、上游、您的 fork(源自本地克隆)
在第 2 步之后,它们看起来像这样:
上游
o---o---o
a b c
分叉
o---o---o
a b c
本地
o---o---o
a b c
在第 5 步之后,repos 看起来像这样:
上游
o---o---o---o---o
a b c d e
分叉
o---o---o---o---o---o
a b c f g h
本地
o---o---o---o---o---o
a b c f g h
也就是说,上游有新的提交 d 和 e,而你已经提交了新的提交 f、g 和 h
现在,你可以git pull --rebase upstream master
存储库现在如下所示:
上游
o---o---o---o---o
a b c d e
分叉
o---o---o---o---o---o
a b c f g h
本地
o---o---o---o---o---o---o---o
a b c d e f' g' h'
f 和 f' 不是同一个提交 - f' 应该等同于 f,但它有不同的父级。
您可以在这里看到,local 现在与 fork 有不同的历史;推动它不仅仅是添加新提交的情况。两者都认为c 之后有不同的提交,两个分支不收敛;如果你添加了所有的提交,你最终会得到这个图表:
,-----------o---o---o
| f g h
o---o---o---o---o---o---o---o
a b c d e f' g' h'
当前的 HEAD 是什么? h 还是 h'?双方都不保留对方的历史。
您可以合并这些,但这是错误的,因为您在 f 和 f'、g 和 g' 等中有相同的更改。
你可以的
git push -f
这会从 fork 中丢弃 f、g 和 h 并使其看起来像 local(您将拥有 f'、@ 987654353@ 和 h' 仍然),如果没有其他人从 fork
克隆,这可能没问题
在第 6 步,你可以做而不是做变基
git pull upstream master
这会导致合并,所以 repos 看起来像这样:
上游
o---o---o---o---o
a b c d e
分叉
o---o---o---o---o---o
a b c f g h
本地
,---o---o---o---,
| f g h |
o---o---o---o---o-------o
a b c d e m
m 是一个合并提交。这可以通过简单地推送到 fork 因为它只是添加额外的提交。
但是,如果您打算向上游发出拉取请求,最好不要合并他们的更改,让他们拉取并处理合并。