使用git进行“多渠道”开发

时间:2013-05-04 09:26:16

标签: git

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

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

  1. 使用merge时,一个分支将消失。 (不是)
  2. 可能会覆盖与固件相关的更改(WP7→WP8)。
  3. 在git中是否有适当的方法来开发几个不同(但相似)的目标SDK,这些SDK依赖于大量相同的代码?

3 个答案:

答案 0 :(得分:1)

  

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

不,没有分支会消失

  

可能会覆盖与固件相关的更改(WP7WP8

首先,请尝试在WP8之上 rebase master
也就是说,尝试在WP8的顶部上应用master (请参阅merge vs. rebase)。 作为Gary Fixler comments below,这对于具有短历史的分支是有意义的(否则,在最近的工作之上重新应用非常旧的提交可能很麻烦,并且历史没有意义)。 / p>


我只提出了rebase,因为将master合并到任何其他分支被认为是不好的做法(这称为“ back merge ”,并使{{3生气;))。

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

详见Adam的文章“Feature branches”。


关于配置文件,您还可以将值存储在分隔文件中,并使用模板文件构建具有正确值的正确配置文件,具体取决于您所在的分支。
请参阅“Branch Per Feature”。

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

答案 1 :(得分:1)

你可以通过分支或文件夹来解决这个问题,但它是子模块的主要候选IMO。我用它们来做这些事。这是一个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)

要制作常用的,您只需要定期回购git clone --bare repo optional_bare_repo_name。如果您没有给它命名,它会将common克隆到名为common.git的文件夹中,这是裸版本。现在你可以在wp repo do git subdmodule add path/to/common optional_folder_name内(如果你没有指定一个,它使用repo文件夹名称)。这有效地将公共仓库克隆到每个wp仓库内的文件夹中。这些也可以是单个回购的分支;你只需要在每个分支上进行子模块添加。

子模块比分支稍微维护一些,但它们做分支不能。它们会在您的仓库中为您提供平行的开发线。当您在wp repo中对公共仓库进行更改时,您将其提交到那里,然后您可以将其推回到外部的裸版普通版本,并将其下拉到其他wp repo的公共仓库中。它只是一个常规的回购,但它的克隆生活在wp回购中。在你的wp repos中,你可以通过首先检查公共仓库中的正确提交,然后在执行git add commongit commit -m'Update common for feature X'的wp仓库外部来告诉它你想要哪个版本。这会在wp repo中创建一个提交,它只是将提交的哈希值存储在公共子模块中。

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

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

答案 2 :(得分:0)

  

可能会覆盖与固件相关的更改(WP7→WP8)。

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

最好的情况是,你可以为两者建立一个分支。共享可共享的文件,并将项目特定的内容存储在单独的目录中,例如arch/wp7arch/wp8