我有一个使用git
开源的项目进行版本控制。很快,我将发布该项目的高级托管版本,但是代码将专门针对高级托管版本(性能等)进行更改,这在开源版本中不应该存在。
我想避免使用两个单独的目录/项目,因为如果我修复了开源版本中的错误,那么该错误最有可能出现在高级托管版本中。我不想在两个地方做出改变。
管理此问题的最佳方法是什么?简单地在git
中分支将无法正常工作,因为某些文件需要有两个版本:开源版本和高级托管版本。
感谢您的帮助。
答案 0 :(得分:28)
然而,分支应该有效,并且允许你维护两个不同的版本。
如果您有适用于高级版本的错误,请在master
上修复,然后将其合并到premium
分支上。
Git只会合并自您在master
和premium
之间分支后更改的内容,即您的错误修复。
另一种在master
和premium
中发布修补程序的方法是从共同的祖先那样做:请参阅“Git merging hotfix to multiple branches”。
2015年更新:git 2。5(2015年7月)已使用新命令git worktree add <path> [<branch>]
替换了下面显示的git-new-workdir
。
有关详情,请参阅“Multiple working directories with Git?”。
2012年原始答案:
me-and在the comments命令 git-new-workdir 中提及。
参见:
对此的一个解决方案是简单地创建存储库的另一个本地克隆。当你在本地克隆时,Git会自动使用硬链接,因此克隆速度非常快 但是这有一个问题:你现在需要另一个独立的存储库来保持最新状态。
这是
git-new-workdir
的来源。
它不是对存储库进行完整的克隆,而是为您设置一个新的工作目录(带有自己的索引)。
实际存储库本身在原始工作目录和新工作目录之间共享。这意味着:
- 如果更新一个存储库,则新提交也会立即显示在所有其他工作目录中。
- 在您的某个工作目录中创建一个新的提交或分支,它们立即可用于所有工作目录。
注意:即使提交是自动进行的,如果您检出了相同的分支,Git也不会更新工作副本。你必须自己这样做。
答案 1 :(得分:3)
使用worktree
最适合此目的。
在我的情况下,我有两个版本的相同软件,基本相同,但每个版本都有一些不同的功能。
所以我创建了两个worktree
,这意味着在主人旁边创建两个相关的长期分支。
$git worktree add -b version-silver ..\version-silver master
$git worktree add -b version-gold ..\version-gold master
然后我有:
$git branch
master # base stuff here
version-silver # some normal features
version-gold # some better features
有一个存储库,但我上面的每个分支都有3个单独的文件夹。并在master中做出共同的改变。然后将其与其他两个版本合并。
cd master
vim basic.cpp
git add .
git commit -m "my common edit on basic.cpp"
cd ..\version-silver
vim silver.cpp
git add .
git commit -m "my specific edit on silver.cpp"
git merge master # here i get the basic.cpp latest changes for silver project
cd ..\version-gold
git merge master # here i get the basic.cpp latest changes for gold project
每个版本的具体更改也将放在相应的文件夹中,并且每个项目的工作都是隔离的,IDE不会混淆。
希望有所帮助。