&引用;多通道;使用git进行开发

&引用;多通道;使用git进行开发,git,Git,我正在为Windows Phone开发一个应用程序,使用SDK 7.1版(适用于WP7),并将其托管在git repo中。为了使其在具有更高分辨率的Windows Phone 8设备上可用,我创建了一个分支WP8,在那里我转换了Visual Studio项目并进行了一些必要的代码调整 现在我继续开发master,我想更新WP8分支中与功能相关的更改。我的第一个想法是合并这些分支,但我担心两个可能的问题: 使用合并时,一个分支将消失。(不正确) 固件相关更改(WP7→ WP8)可能被覆盖 在git

我正在为Windows Phone开发一个应用程序,使用SDK 7.1版(适用于WP7),并将其托管在git repo中。为了使其在具有更高分辨率的Windows Phone 8设备上可用,我创建了一个分支
WP8
,在那里我转换了Visual Studio项目并进行了一些必要的代码调整

现在我继续开发
master
,我想更新
WP8
分支中与功能相关的更改。我的第一个想法是合并这些分支,但我担心两个可能的问题:

  • 使用
    合并
    时,一个分支将消失。(不正确)
  • 固件相关更改(WP7→ WP8)可能被覆盖
  • 在git中是否有一种合适的方法来为依赖大量相同代码的几个不同(但类似)的目标SDK开发

    使用“合并”时,一个分支将消失

    不,没有分支会消失

    固件相关更改(
    WP7
    → <代码>WP8)可能被重写

    首先,尝试在
    master
    的基础上
    WP8
    也就是说,尝试在
    master
    上应用
    WP8
    (请参阅)。
    因此,对于历史记录较短的分支来说,这是有意义的(否则,在最近的工作之上重新应用非常旧的提交可能会很麻烦,而且历史记录也没有意义)


    我只提到了rebase,因为将
    master
    合并到任何其他分支(这被称为“”,并且会让人生气;)被认为是不好的做法

    您应该使用,然后可以将其合并到
    master
    WP8
    分支。
    这充分利用了git提供的分支的便利性,并且只给
    master
    留下一个稳定的代码状态:任何到
    master
    的进一步演化都应该在一个特性分支中完成(然后合并到
    master
    ),而不是在
    master
    中完成(导致“反向合并”)从
    master
    到另一个分支,这是不好的做法)

    详见亚当的文章“”


    关于配置文件,您还可以将值存储在单独的文件中,并使用模板文件使用正确的值构建正确的配置文件,具体取决于您所在的分支。
    见“”

    这样,您就希望在不同的分支中具有不同内容的文件存在任何合并问题,因为它们的值存储在不同的文件中

    固件相关更改(WP7→ WP8)可能被覆盖

    分支是指同一事物在不同开发阶段的版本。如果合并一个分支,git将尝试将所有更改从一个分支移动到另一个分支。没有简单的方法可以将与体系结构无关的更改从一个分支转移到另一个分支


    最好的情况是,您可以同时为这两个分支构建一个分支。共享可以共享的文件,并将特定于项目的内容存储在单独的目录中,如
    arch/wp7
    arch/wp8

    您可以通过分支或文件夹来实现这一点,但它是子模块的首选。我用它们来做这些事情。以下是一组3份回购协议的示例:

    common/ (bare repo of common files)
        .git/
    
    wp7/ (regular repo of wp7 specifics)
        .git/
        common/ (submodule)
    
    wp8/ (same as wp7, but for wp8)
        .git/
        common/ (submodule)
    
    要制作一个普通的,您只需使用一个常规的repo和
    git克隆--bare repo可选的\u bare\u repo\u name
    。如果不给它命名,它会将
    common
    克隆到名为
    common.git
    的文件夹中,这是一个裸版本。现在,您可以从wp repo do
    git子模块中添加path/to/common optional\u folder\u name
    (如果未指定,则使用repo文件夹名称)。这将有效地将公共repo克隆到每个wp repo内的文件夹中。这些也可以是单一回购的分支;您只需在每个分支上添加子模块

    子模块比分支稍微多一些维护,但它们做了分支不能做的事情。他们在回购协议中给你一条平行的发展线。当您在任何一个wp repo内部的公共回购中进行更改时,您可以在那里提交该更改,并且您可以将其推回到公共的外部裸露版本,并在另一个wp repo的公共回购中将其下拉。这只是一个普通的回购协议,但它的克隆体存在于wp回购协议中。在wp repo中,您可以通过首先在公共repo内部检查正确的提交,然后在wp repo外部执行
    git add common
    git commit-m'Update common for feature X'
    来告诉它您现在想要哪个版本。这将在wp repo中创建一个commit,它只将commit的散列存储在公共子模块中

    稍后在wp-repo中签出此提交时,它将签出wp代码,并在公共repo中签出相应的提交。基本上,您可以跟踪在特定时间的普通回购协议版本。这很好,有几个原因。首先,如果您不想要或不需要,您不必在特定的wp回购中获得最新的共同点。这还意味着您可以在公共repo中签出旧的提交,添加它,并在wp repo中提交它,然后根据需要对旧的提交进行处理。不过,这还需要一点工作,你必须记住,要一起在wp和普通回购协议中工作。我每天都这么做,但我听很多人说太麻烦了


    您还可以在wp repo中添加和提交特定版本的common以及文件,例如,您可以进入并重构common,跳出并修复wp7中针对该重构的更改,然后在wp7中添加common和wp7更改,并提交它们以跟踪这两个更改。现在,如果您回滚1次提交,那么公共回购也将回滚到重构之前,这样您就可以在每次提交时都有正常运行的代码。

    重新基址不会完全像合并一样覆盖吗?我认为区别在于,rebase复制了单个分支提交给master的内容,而