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

时间:2013-02-01 22:54:44

标签: visual-studio git branch

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

我继承了一个没有源代码控制的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提供程序完成。是否支持,或者必须使用控制台完成?

如果它与另一个答案重叠,那么再次表示感谢和抱歉。

1 个答案:

答案 0 :(得分:0)

我对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...

然后,您将要删除的哈希的前几个字符复制到 cherry pick ,更改为客户2的分支,并将 cherry pick 复制到分支中。

git checkout customer2Branch
git cherry-pick 2e8c40025939e8c

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

  
      
  • 我可以"标记"具体的代码行,以便它们不被合并/提交?
  •   

您可以在此处找到并回答类似问题的帮助:

Commit only part of a file in Git

  
      
  • 三个或更多开发人员将在此工作,每个开发人员都在自己的机器中,但是将更改推送到公司的存储库以进行同步。这个过程有什么影响?
  •   

由于GIT是一个完全分布式的VCS,因此团队中的每个开发人员都可以在自己的计算机上完全克隆中央存储库(完整地拥有该存储库的完整历史记录)。这意味着日志历史记录查询和其他请求(例如,找出谁做了什么)不需要通过你的中央服务器,但可以由每个开发人员私下和离线完成。

同样,每个开发人员所做的更改都将对所有人开放(例如,所有新的分支都可用),但如果你不这样做,有时可能会对同样的功能感到沮丧。非常习惯于git。

一如既往地提前和经常提交是一个好主意,这将减少你在变化发生冲突时可能面临的紧张局势。你还应该设置一些结构,以便在完成推送时,特别是如果你依赖彼此的工作继续。

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

  
      
  • 现在,每个客户都有一个单独的文件夹和单独的项目文件及其所有源代码。怎么会进口   将这些文件夹放入Git的过程?
  •   

修改

感谢您澄清这个问题的含义。您可以扩展一种类似于此处给出的答案的方法:How do you create a remote Git branch?

为您的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>

这将在名为remote-branch-name的分支下的名为local-branch-name的远程存储库上建立您的Baseline项目。

然后,您可以导航到其他项目并重复这些步骤,通过使用新的本地分支名称将您的存储库放在同一个遥控器上的不同分支下,即在创建分支时不使用local-branch-name,只需使用新分支名称,例如git checkout -b new-local-branch-name

所以,例如,如果您的基础项目推送(最后一行代码)是:

git push clientproject base

客户项目&#34;是您的遥控器的名称,&#34; base&#34;是您本地分支的名称,您只需将该行更改为:

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

请注意,虽然删除&#34; base&#34;并非绝对必要。在继续之前分支,它确实保持您的存储库更清洁,因此被认为是良好的做法。不要担心失去任何东西,你在基地的整个git历史将在结账时被复制到client1。

另请注意:由于您的情况要求您从不同的目录执行此操作,您可能会删除名为&#34; master&#34;而不是&#34; base&#34;。

这样推动会将client1保留在&#34; clientproject&#34;远程,但将项目置于名为client1的新分支上,并具有自己的历史记录。

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

  
      
  • 所有这一切都必须使用Visual Studio,Gitextensions和VS的Git Source提供程序完成。是支持还是必须完成   用控制台?
  •   

我还没有和Git一起使用VS,但我认为大多数情况下都支持所有这些操作,因为它们是本机git命令。

希望这有帮助。