以下一系列git命令导致repos to diverge。我做错了什么?
致电父项目'上游'
git pull --rebase upstream master
git push origin master
git pull
,这最终会破坏历史。这样做的正确方法是什么?
答案 0 :(得分:1)
让我们解决这个问题。
有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'
,g'
和h'
,如果没有其他人从 fork 克隆
在第6步,您可以完成
,而不是进行rebasegit 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 ,因为它只是添加了额外的提交。
如果您计划向上游发出拉取请求,最好不要合并其中的更改,并让他们拉动并处理合并。