如何防止叉式git回购发散

如何防止叉式git回购发散,git,gitlab,git-fork,Git,Gitlab,Git Fork,下面的一系列git命令导致repos发散。我做错了什么 GitLab的Fork项目 将父项目称为“上游” 从分叉项目克隆回购协议 在分支母版中进行本地编辑 提交本地编辑,推送至分叉回购 上游回购有其他开发商的承诺 从上游回购获取最新提交 git pull——重新设置上游主节点的基础 将来自上游的当前本地的最新提交合并到 分岔回购 git推送源主机 git说我的分支已经分别偏离了x提交和y提交。让我做一个git pull,这最终会弄乱历史 正确的方法是什么 让我们一起来解决这个问题 有3个存

下面的一系列git命令导致repos发散。我做错了什么

  • GitLab的Fork项目 将父项目称为“上游”

  • 从分叉项目克隆回购协议
  • 在分支母版中进行本地编辑
  • 提交本地编辑,推送至分叉回购
  • 上游回购有其他开发商的承诺
  • 从上游回购获取最新提交 git pull——重新设置上游主节点的基础

  • 将来自上游的当前本地的最新提交合并到 分岔回购 git推送源主机

  • git说我的分支已经分别偏离了x提交和y提交。让我做一个
    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