52

git我有一个用于修订控制的开源项目。很快,我也将发布该项目的高级托管版本,但是将专门针对高级托管版本(性能等)对代码进行更改,这些更改不应该存在于开源版本中。

我想避免有两个单独的目录/项目,因为如果我修复了开源版本中的错误,那么该错误很可能也出现在高级托管版本中。我不想在两个地方进行更改。

管理此问题的最佳方法是什么?简单地分支是git行不通的,因为有些文件需要有 2 个版本:一个开源版本和一个高级托管版本。

4

2 回答 2

41

然而,分支应该可以工作,并且允许您维护两个单独的版本。

如果您有适用于高级版本的错误,请在 上修复它,然后在分支上master合并它。 Git 只会合并自从你在and之间分支以来发生的变化,即你的错误修复。 另一种发布修补程序的方法是在共同祖先中发布修补程序:请参阅“ Git 将修补程序合并到多个分支”。premium
masterpremium
masterpremium


2015 年更新:git 2.5(2015 年 7 月)已替换git-new-workdir为新命令git worktree add <path> [<branch>]

有关更多信息,请参阅“使用 Git 的多个工作目录? ”。


2012年原始答案:

我在评论中提到了命令 git-new-workdir
看:

一种解决方案是简单地创建存储库的另一个本地克隆。Git 在本地克隆时会自动使用硬链接,因此克隆速度非常快。
但是这样做有一个问题:您现在有另一个单独的存储库,您需要保持最新状态。

这就是它的git-new-workdir用武之地。它
无需对存储库进行完整的克隆,而是为您简单地设置一个新的工作目录(具有自己的索引)。
实际存储库本身在原始工作目录和新工作目录之间共享。这表示:

  • 如果您更新一个存储库,新的提交也会立即在所有其他工作目录中可见。
  • 在您的一个工作目录中创建一个新的提交或分支,它们立即在所有工作目录中可用。

注意:即使提交是自动存在的,如果您已签出相同的分支,Git 也不会更新工作副本。你必须自己做。

于 2012-08-28T06:00:15.870 回答
14

worktree为此目的最好使用。

就我而言,我有两个版本的相同软件,基本相同,但每个版本都有一些不同的功能。

所以我创建了两个worktree,这意味着,在 master 旁边创建两个相关的长期运行的分支。

$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。

希望有帮助。

于 2017-07-21T05:26:52.830 回答