如何防止叉式git回购发散
下面的一系列git命令导致repos发散。我做错了什么如何防止叉式git回购发散,git,gitlab,git-fork,Git,Gitlab,Git Fork,下面的一系列git命令导致repos发散。我做错了什么 GitLab的Fork项目 将父项目称为“上游” 从分叉项目克隆回购协议 在分支母版中进行本地编辑 提交本地编辑,推送至分叉回购 上游回购有其他开发商的承诺 从上游回购获取最新提交 git pull——重新设置上游主节点的基础 将来自上游的当前本地的最新提交合并到 分岔回购 git推送源主机 git说我的分支已经分别偏离了x提交和y提交。让我做一个git pull,这最终会弄乱历史 正确的方法是什么 让我们一起来解决这个问题 有3个存
git pull
,这最终会弄乱历史正确的方法是什么 让我们一起来解决这个问题 有3个存储库:本地克隆、上游、分支(本地克隆的来源) 在第2步之后,它们看起来像这样: 上游 叉子 本地的 第5步之后,回购协议如下所示: 上游 叉子 本地的 也就是说,上游有新的提交
d
和e
,而您有新的提交f
、g
和h
现在,您可以git-pull——重新设置上游主机的基址
存储库现在如下所示:
上游
叉子
本地的
其中f
和f'
不是相同的提交-f'
应该等同于f
,但它有不同的父级
你可以在这里看到,当地人现在有了不同的历史;推动它不仅仅是添加新提交的情况。他们都认为不同的提交发生在c
之后,并且这两个分支不收敛;如果您添加了所有提交,您将得到以下图形:
,-----------o---o---o
| f g h
o---o---o---o---o---o---o---o
a b c d e f' g' h'
那么现在的头是什么呢<代码>h或h'
?两者都不保留对方的历史
您可以合并这些,但这是错误的,因为在f
和f'
、g
和g'
等中有相同的更改
你可以
git push -f
这将从fork中丢弃f
、g
和h
,并使其看起来像本地的(您将拥有f'
、g'
和h'
),如果没有其他人从fork中克隆,这可能很好
在步骤6中,您可以执行以下操作,而不是执行重基
git pull upstream master
这将导致合并,因此回购协议将如下所示:
上游
叉子
本地的
其中m
是合并提交。这可以通过简单地推送到fork来实现,因为它只是添加了额外的提交
但是,如果您计划向upstream发出请求,最好不要将他们的更改合并到中,让他们拉取并处理合并。首先,您应该为此获得奖励。那太棒了
git push-f
是我想要的b/c其他人不会克隆分叉回购。最终,我希望所有3个回购协议保持同步。如果我使用git push-f,那么我可以从上游拉/推而不出现任何分歧问题吗?可以。你可以推动,如果这是一个快速前进的回购你正在推动。也就是说,您可以简单地将新提交和推进头添加到最新提交。如果远程回购的负责人不是你推动的负责人的祖先,则回购协议已发生分歧。当你的git工作原理的心智模型是准确的,但很难解释时,这一切都是有意义的。我会尝试一下,确保它能工作。然后接受相应的答案。再次感谢你push-f
工作起来很有魅力。正是我需要的。非常感谢。
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
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'
,-----------o---o---o
| f g h
o---o---o---o---o---o---o---o
a b c d e f' g' h'
git push -f
git pull 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---,
| f g h |
o---o---o---o---o-------o
a b c d e m