如何防止分叉git repo发散

时间:2017-09-21 10:16:39

标签: git gitlab git-fork

以下一系列git命令导致repos to diverge。我做错了什么?

  1. 来自GitLab的Fork项目
      

    致电父项目'上游'

  2. 来自分叉项目的克隆回购
  3. 在分支主文件中进行本地编辑
  4. 提交本地修改,推送到分叉回购
  5. 上游回购已提交其他开发者
  6. 抓住上游回购的最新提交
      

    git pull --rebase upstream master

  7. 合并来自上游的最新提交,现在是本地的 分叉回购
      

    git push origin master

  8. git说我的分支分别由x commits和y commitit分歧。请我做git pull,这最终会破坏历史。
  9. 这样做的正确方法是什么?

1 个答案:

答案 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

也就是说,上游有新的提交de,您已经进行了新的提交fgh

现在,您执行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'

ff'不同的提交 - 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是什么? hh'?既不保留对方的历史。

您可以合并这些内容,但这是错误的,因为您在ff'gg'等方面有相应的更改。

你可以做到

git push -f

这会从 fork 中丢弃fgh并使其看起来像 local (你会仍有f'g'h',如果没有其他人从 fork 克隆

,这可能会很好

在第6步,您可以完成

,而不是进行rebase
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 ,因为它只是添加了额外的提交。

如果您计划向上游发出拉取请求,最好不要合并其中的更改,并让他们拉动并处理合并。