在VS中维护同一个基础项目的多个分支

我浏览过这个网站,但是我找不到完全覆盖我的答案,所以如果我错过了,请提前原谅我。

我继承了一个没有源代码控制的VB.NET项目(它开始作为一个长期以来的开发者的宠物项目,并且没有人曾经为此而烦恼过),并且根据朋友的建议,我考虑过使用Git源代码管理。

该项目是根据客户的规格定制和销售的利基产品,因此即使95%的代码对所有客户都是相同的,但有时高达10%的代码也会改变和定制对于每个客户,通过改变或添加现有功能的行,有时会添加整个代码块,但不同客户之间的更改没有共同之处(在另一个中更改的功能可能不会更改)。

更复杂的是,由于维护合同,对基线应用程序的更新必须在客户的分支机构中复制,如果他们需要它们,有时候我们为特定客户做出的更改足够好,我们希望将它们放入基线应用程序并将其复制到其他客户,但保留每个客户的定制!

所以,凭借我对Git的一点知识,我认为它会是这样的:

          (customer 1)
         C1-----
(main)  /
A------B------D
        
          (customer 2)
         C2-----
        
          (customer 3)      
         C3-----

......但是我不明白它会如何工作:

  • 我能否将客户分支机构的一些变更合并到主干中,而不合并仅对该客户有用的其他变更?
  • 我可以将主干线的一些更改合并到每个客户的分支机构中,而不会丢失这些分支机构中的定制设置吗?
  • 我可以“标记”特定的代码行,以便它们不合并/提交吗?
  • 三个或更多的开发人员将在这个工作,每个在他自己的机器,但推动公司的存储库的同步变化。 这个过程有什么影响?
  • 现在, 每个客户都有一个单独的文件夹和单独的项目文件及其所有源代码。 导入过程如何将这些文件夹放到Git中?
  • 所有这些都必须在Visual Studio中完成,使用Gitextensions和VS的Git Source提供程序。 是否支持,还是必须使用控制台完成?
  • 如果它与另一个答案重叠,谢谢并再次抱歉。


    我对git比较陌生,通常在我的所有操作中都使用PoshGit,所以虽然我可能无法帮助您处理所有事情,但我希望我可以帮助您解决一些问题:

  • 我能否将客户分支机构的一些变更合并到主干中,而不合并仅对该客户有用的其他变更?
  • 我可以将主干线的一些更改合并到每个客户的分支机构中,而不会丢失这些分支机构中的定制设置吗?
  • 根据我的理解,这两个操作都可以通过使用git cherry pick来实现,它允许你从一个分支中选择一个特定的提交,并将其添加到另一个分支,而不需要将分支合并到一起。

    例如,假设您想要将对customer1的存储库所做的更改添加到customer2中:

    首先,您获取要插入到customer2中的来自客户1的提交的哈希ID

    git checkout customer1Branch
    git log 
    
    commit 2e8c40025939e8cf41dec70f213da75aa462184b
    Author: xxxxxxx
    Date: xxxxxx
    
    This made a change that you want...
    

    然后,您复制要挑选的哈希的前几个字符,更改为客户2的分支,然后樱桃将入分支。

    git checkout customer2Branch
    git cherry-pick 2e8c40025939e8c
    

    现在,如果你做了一个git log ,你会在顶部看到你的樱桃选择。 可以在这里找到类似的教程(http://nathanhoad.net/how-to-cherry-pick-changes-with-git)

  • 我可以“标记”特定的代码行,以便它们不合并/提交吗?
  • 您可能会在这里找到并回答类似问题的帮助:

    在Git中只提交一部分文件

  • 三个或更多的开发人员将在这个工作,每个在他自己的机器,但推动公司的存储库的同步变化。 这个过程有什么影响?
  • 由于GIT是完全分布式VCS,您团队中的每个开发人员都将在自己的机器上有效地完成中央回购的克隆(完整回购的历史记录)。这意味着日志历史查询和其他请求(例如查找谁做了什么)不需要通过中央服务器,但可以由每个开发人员私下和离线完成。

    同样,每个开发人员所做的更改都可供所有人使用(例如,所有新分支都可用),但如果您不习惯使用git,则有时可能会因使用相同的功能而感到沮丧。

    像往常一样,它是一个很好的主意,可以提早并且经常地进行,这将减少当更改发生冲突时您可能面临的紧张情绪。 你也应该设置一些结构来完成推动,特别是如果你依靠对方的工作继续下去。

    您可能想要尝试的另一个想法是让一个人负责回购,并让他合并更改和补丁以帮助协调您的工作。

  • 现在,每个客户都有一个单独的文件夹和单独的项目文件及其所有源代码。 导入过程如何将这些文件夹放到Git中?
  • 编辑

    感谢您澄清这个问题的含义。 你可以扩展一个类似的方法,从这里给出的答案改编:你如何创建一个远程Git分支?

    为BASE项目创建一个新的主线分支并将其推送到远程存储库。

    cd baseProjectDirectory # navigate to your main project directory
    git init # git initialize the dir
    git add . # recursively add all files in directory to git repo
    git remote add <remote-branch-name> <remote-url> # Add the url to your remote directory to your git repo
    git commit -m "Initial commit of base project"
    git push <remote-branch-name> <local-branch-name>
    

    这将在名为local-branch-name下的名为remote-branch-name的远程存储库上建立基线项目。

    然后,您可以浏览到其他项目,重复以上步骤把你的仓库放在同一个遥控器上的不同分支,通过使用新的本地分支机构的名称,即而不是使用local-branch-name创建分支时,只使用一个新的分支名称,比如git checkout -b new-local-branch-name

    所以如果你的基础项目推动(最后一行代码)是:

    git push clientproject base
    

    其中“clientproject”是您的远程名称,“base”是您本地分支的名称,您可以将该行更改为:

    git checkout -b client1 # Creates new branch named client1
    git branch -d base # Deletes base branch
    git push clientproject client1
    

    请注意,尽管在继续之前删除“基本”分支并不是绝对必要的,但它确实使您的存储库更加清洁,因此被认为是最佳做法。 不要担心丢失任何东西,但是您的整个基地git历史记录将在结帐时复制到client1。

    另外请注意:由于您的情况要求您从不同的目录执行此操作,因此您可能会删除名为“master”而不是“base”的分支。

    像这样推动将client1保留在“clientproject”远程,但将把项目置于一个叫做client1的新分支上,并完成自己的历史记录。

    其余的项目可以使用相同的步骤。 如果我在途中丢失了你,我建议阅读上面的链接(它比我更简洁)。

  • 所有这些都必须在Visual Studio中完成,使用Gitextensions和VS的Git Source提供程序。 是否支持,还是必须使用控制台完成?
  • 我还没有在Git中使用过VS,但是我认为大部分操作都会被支持,因为它们是原生的git命令。

    希望这可以帮助。

    链接地址: http://www.djcxy.com/p/4193.html

    上一篇: Maintaining multiple branches of the same base project in VS

    下一篇: CMake compiler settings specific to the local working copy