我正在寻找与GIT合作的最佳实践。这是我的问题:
我有一个BASE项目,并为每个客户端克隆它。因为这些项目非常相似(只更改一些配置文件和图像),每个Web项目将存储在不同的目录中。
所以我认为最佳做法是克隆基础项目,进行一些更改并上传到新客户端目录。
直到这里一切正常但是:如果我发现了一个关键错误,或者如果我向所有(或某些)项目添加新功能,我如何合并更改?我是否需要创建补丁或类似的东西?怎么样?
我想,如果你愿意,一个容易理解的答案,因为我不是GIT大师(但我想学习!)
非常感谢!
答案 0 :(得分:2)
您可能需要权衡您的选项,具体取决于您希望合并到部分/全部客户端存储库(基本存储库)中的基本存储库(客户端存储库)中的更改。
假设您希望将更改合并到客户端中,并且您想要的更改是基于的。 假设您有一个指向基本存储库的远程数据库。 所以,在你的客户回购中,你会:
git remote add basepro <url>
以下是您可能遇到的一些情况:
您在基本存储库中进行了基本更改/主要错误修复,您希望将其合并到所有/部分客户端中。 如果您的基础存储库也是本地的,并且重写提交历史记录不会影响您,您可以考虑使用rebase:
git rebase -i basepro/master
这会将您带回到基础项目和客户端项目的最后一个常见提交,然后逐个应用您对客户端项目所做的所有提交。但是,您可能必须在此处手动合并一些更改并继续:
git rebase --continue
如果您希望在开始处理特定于客户端的更改之前,提交历史记录看起来好像您在基础中具有该功能,那么Rebase就是您的朋友。 在您的其他客户项目中,您可能会同样重新绑定到您想要的分支,甚至是specific commits您想要重新定位的分支。
您希望只将基本存储库中的特定提交应用于客户端存储库或将一个客户端的特定提交应用于另一个客户端。
git cherry-pick -Xpatience <commit>
您还可以指定一系列提交。
您在client1和client2中有类似的文件,它们都基于基础文件。现在,您希望将这两个客户端中的这些文件合并为另一个客户端3。
在这种情况下,您可能希望使用
git merge-file <client1file> <basefile> <client2file>
合并的文件将写入client1file
。在这种情况下,当您处于客户端3 repo时,您必须先将checkout
所需文件放入工作树中。
git checkout baserepo/master -- basefile
将签出基本文件。
您可以依赖git merge
,以防您的基地现在拥有您希望在客户端中使用的某些功能,并且不会影响您对客户端的独立开发,或者在您想要分支的任何其他情况下直接合并到您当前的分支。
您可能希望使用我们的策略来保持客户端仓库的更改,以防发生冲突
或者做一个手动修复,只是为了确定。
git merge -s ours baserepo/master
应用补丁也可以按照this回答中的说明完成:
答案 1 :(得分:1)
你可以做什么 - 你可以添加其他存储库作为遥控器和樱桃挑选更改。
git remote add project <address>
git checkout project master
git cherry-pick <sha1>