1

我正在寻找使用 GIT 的最佳实践。这是我的问题:

我有一个 BASE 项目,对于每个客户,我都会克隆它。因为这些项目将非常相似(仅更改一些配置文件和图像),并且每个 Web 项目将存储在不同的目录中。

所以我认为最好的做法是克隆基础项目,进行一些更改并上传到新的客户端目录。

直到这里一切都很好,但是:如果我发现一个严重的错误或者如果我向所有(或某些)项目添加新功能,我该如何合并更改?我需要创建补丁或类似的东西吗?如何?

如果您愿意,我想要一个简单易懂的答案,因为我不是 GIT 大师(但我想学习!)

非常感谢!

4

2 回答 2

3

您可能需要根据您想要合并到部分/所有客户端存储库(基本存储库)中的基本存储库(客户端存储库)中的更改来权衡您的选项。

假设您希望将更改合并到客户端中,并且您想要的更改位于基础中。假设您有一个指向基础存储库的遥控器。因此,在您的客户回购中,您将:

git remote add basepro <url>

以下是您可能会遇到的一些情况:

  1. 您在基本存储库中进行了基本更改/主要错误修复,您希望将其合并到所有/部分客户端中。如果您的基础存储库也是本地的并且重写提交历史不会影响您,您可以考虑使用 rebase:

    git rebase -i basepro/master
    

    这将带您回到基础项目和客户项目的最后一次共同提交,然后将您所做的所有提交一一应用到客户项目。但是,您可能必须在这里和那里手动合并一些更改并继续:

    git rebase --continue
    

    如果您希望提交历史记录看起来好像您在开始处理特定于客户端的更改之前在基础中具有该功能,那么 Rebase 是您的朋友。在您的其他客户端项目中,您可能会类似地重新定位到您想要的分支,甚至是您想要重新定位的特定提交。

  2. 您只想将基础存储库中的特定提交应用于客户端存储库,或者将一个客户端的特定提交应用于另一个客户端。

    git cherry-pick -Xpatience <commit>
    

    您还可以指定提交范围。

  3. 您在 client1 和 client2 中有类似的文件,它们都基于 base 中的一个文件。现在,您想将两个客户端中的这些文件合并为另一个客户端 3。

    在这种情况下,您可能需要使用

    git merge-file <client1file> <basefile> <client2file>
    

    合并后的文件将被写入client1file. 在这种情况下,当您在客户端 3 存储库中时,您必须首先checkout将所需的文件放入您的工作树中。

    git checkout baserepo/master -- basefile
    

    将签出基本文件。

  4. git merge 如果您的基础现在有一些您想要在您的客户端中使用的功能并且不会影响您的客户端的独立开发,或者在您希望将分支直接合并到当前分支中的任何其他情况下,您可以依赖它。您可能希望使用我们的策略来保留客户端 repo 的更改以防发生冲突或进行手动修复,以确保。

    git merge -s ours baserepo/master
    
  5. 也可以按照答案中向我解释的方式应用补丁:

于 2013-07-11T22:22:02.103 回答
1

您可以做的是 - 您可以将其他存储库添加为遥控器并将樱桃选择更改为其中。

 git remote add project <address>
 git checkout project master
 git cherry-pick <sha1>
于 2013-07-11T14:41:47.710 回答