Git 如何保持分支与主机同步/更新?

Git 如何保持分支与主机同步/更新?,git,git-merge,git-branch,Git,Git Merge,Git Branch,目前git正在努力,我无法为下面的问题找到最佳解决方案 有两个分支,一个称为master,另一个称为mobiledevicesupport。我希望将mobiledevicesupport保持为一个连续分支,只要mobiledevicesupport稳定,它就会与主分支合并/同步。这会将来自mobiledevicesupport的更改合并到master中,但也会将来自master的所有更改合并到mobiledevicesupport中,以便继续处理分支,并改进或修改功能。这需要与一个中央存储库和多

目前git正在努力,我无法为下面的问题找到最佳解决方案

有两个分支,一个称为master,另一个称为mobiledevicesupport。我希望将mobiledevicesupport保持为一个连续分支,只要mobiledevicesupport稳定,它就会与主分支合并/同步。这会将来自mobiledevicesupport的更改合并到master中,但也会将来自master的所有更改合并到mobiledevicesupport中,以便继续处理分支,并改进或修改功能。这需要与一个中央存储库和多个开发人员协作

请举例说明其他人使用的类似流程,或者告诉我这个想法是否愚蠢,我应该考虑其他的选择。目前,工作流程似乎很合理,但我不知道如何让git以这种方式工作

谢谢,非常感谢大家的帮助

更新1: 如果我要将master合并到mobiledevicesupport中,并将mobiledevicesupport合并到master中,那么我是否可以跨这两个分支复制提交。或者git是否足够聪明,我已经将最新的更改从分支A拉到分支B,并将合并提交C添加到分支B。我已经将最新的更改从分支B拉到分支A,并将合并提交D添加到分支A

我本来打算发布一张图片,但我没有足够的声誉,所以我想下面的插图就可以了。两个分支连续运行,合并经常向两个方向进行。我不确定的关键问题是git将如何执行提交,以及它将如何在合并时用来自另一个分支的提交填充任一分支,还是保持干净。我以前使用过rebase,但它似乎结束了分支并将所有的提交都放到了主节点中,否则我就做错了。谢谢你迄今为止的帮助

master
A--B--C-----H--I--J--M--N
       \   /    \
mobile  \ /      \
D--E--F--G--------K--L

你的想法是正确的。持续将主设备与移动设备支持合并,并在移动设备支持稳定时将移动设备支持与主设备合并。每个开发人员都有自己的分支,可以根据其角色在master或mobiledevicesupport上进行合并。

是的,我同意您的方法。要将mobiledevicesupport合并到master中,您可以使用

git checkout master
git pull origin master //Get all latest commits of master branch
git merge mobiledevicesupport
同样,您也可以在mobiledevicesupport中合并master

问:是否存在交叉合并问题

答:这取决于上次同步mobile*分支和master分支时所做的提交。举个例子: 在上次同步之后,这些分支将发生以下提交

Master branch: A -> B -> C [where A,B,C are commits]
Mobile branch: D -> E
现在,假设commit B对文件a.txt做了一些更改,commit D也对a.txt做了一些更改。现在让我们来看看每一次合并行动的影响,

git checkout master //Switches to master branch
git pull // Get the commits you don't have. May be your fellow workers have made them.
git merge mobiledevicesupport // It will try to add D and E in master branch.
现在,有两种类型的合并是可能的

  • 快进合并
  • 真正的合并(需要手动操作)
  • Git将首先尝试进行FF合并,如果发现任何冲突Git都无法解决。它使合并失败,并要求您合并。在这种情况下,将发生一个新的提交,负责解决a.txt中的冲突

    所以底线是交叉合并不是一个问题,最终你必须这么做,这就是同步的含义。在生产中做任何事情之前,确保在合并分支时弄脏了手。

    是的,就这么做吧

    git checkout master
    git pull
    git checkout mobiledevicesupport
    git merge master
    
    使移动设备支持与主机保持同步

    然后,当您准备将mobiledevicesupport放入master时,首先像上面那样在master中合并,然后

    git checkout master
    git merge mobiledevicesupport
    git push origin master
    
    就这样


    这里的假设是mobilexxx是一个主题分支,它的工作还没有准备好进入主分支。因此,只有当mobiledevicesupport处于良好位置时,才能合并到master中

    每当您想将更改从master获取到您的工作分支中时,请执行一个
    git-rebase/master
    。如果有任何冲突。解决它们


    当您的工作分支准备就绪时,再次重新设置基址,然后执行git push HEAD:master。这将更新远程(中央回购)上的主分支。

    concept47的方法是正确的,但我建议与--no ff选项合并,以保持提交历史记录的清晰

    git checkout develop
    git pull --rebase
    git checkout NewFeatureBranch
    git merge --no-ff master
    

    通过git merge接受的答案将完成任务,但会留下一个混乱的提交过程,正确的方法应该是通过以下步骤“重新设置基础”(假设您希望在PR之前进行最后推送之前将您的特性分支保持在sycn和develop中)

    1
    git fetch
    从您的功能分支(确保您正在处理的功能分支是最新的)

    2
    git重新基准来源/发展

    3如有冲突,应逐一解决

    4使用
    git-rebase——在处理完所有冲突后继续


    5
    git push--force

    运行以下命令:

    $ git checkout mobiledevice
    $ git pull origin master 
    
    这将合并对分支的所有最新提交。如果合并导致一些冲突,则需要修复它们


    我不知道这是否是最好的做法,但对我来说是有效的。

    所以像这样的交叉合并不是问题吗?交叉合并就是我们所说的同步,不是问题,除非两个分支中的提交都不会导致任何冲突。请看我更新的答案。这听起来很合理,我想我不确定这会使提交历史变得多么肮脏,我将用一个我认为会发生什么的示例更新我的问题。您将有相当多的“合并提交”,基本上是git试图解决您的分支之间的差异。如果您担心这一点,并且您是唯一使用该分支的人,那么请执行“git rebase master”而不是“git merge master”,并且不要将提交推送到远程分支。如果您这样做了,您将发现自己对origin/mobiledevicesupport进行了大量的强制推送(git push--force),因为您(可能)总是向它发送与远程分支不匹配的提交历史记录。这里有更多的细节