【问题标题】:version control版本控制
【发布时间】:2011-06-17 16:11:45
【问题描述】:

首先,对不起,因为我的英语和解释都很差。这是收到一些 cmets 后我的问题的编辑版本,我意识到是什么让你感到困惑。

我正在做的项目大约有 10 个人,每个人都会在项目中实施一些“工作”。

  • 我们共享 20 个模型文件(文本文件)
  • 当人们做“工作”时,他们必须直接进入模型文件并在上面的 20 个文本文件中添加/删除/编辑一些行。

假设:

  • A 实施的工作编号。 1、4、6 和 10。
  • B 实施的工作编号。 2、3、7 和 9。
  • ...

AB 实施 (7) 之前实施 (4)。 在文件 X 中,由 (4) 更改的一些值/行被 (7) 覆盖。

稍后,当我们运行节能评估并发现 (4) 实际上根本不节能,因此我们决定将 (4) 取出。

所以问题是,如果我们有任何版本控制可以取出 (4)(由 A 实现)而不触及由 (7)(由 B 实现)创建的任何覆盖值/行。
换句话说,我只想删除 A 对工作编号 (4) 所做的所有更改。 A 完成的工作 1、6、10 仍在模型文件中。

现在我们正在使用 RCS...但我不知道 RCS 是否可以做到以及如何做到这一点?
我正在考虑 GIT 和 SVN。我认为 SVN 更合适,因为项目中的所有数据都放在 1 个地方(1 个文件夹)。我们的服务器是 Linux Red Hat。

如果你遇到过这种情况,请分享。

再次抱歉,感谢您的宝贵时间。

【问题讨论】:

  • 让我确保我理解正确。您有一段代码 (4) 创建一个文件,另一段 (7) 修改该文件,并且想要恢复 4?或者你有一段代码 (4) 修改了前面的模块 (0),然后 7 也修改了 0,但是因为它后来也修改了 4?
  • 我们正在共享模型文件。因此,例如,我在文件 X 中有一个模型。现在,(4) 更改了 X 中的一些值。在 (4) 完成一周后,(7) 更改了与 (4) 更改相同的值。

标签: version-control


【解决方案1】:

对于配置,最好是版本:

  • 一个模板配置文件,里面只有变量
  • 每个模块的值分别
  • 一个能够识别正在运行的模块并将模板文件中的变量替换为实际值的脚本

这样:

  • 实际的配置文件(具有模块使用的值的那个)永远不会被版本控制(但总是生成)。
  • 它处理任何模块组织/依赖项(因为,就像评论中提到的Jon 一样),如果您有一个由多个模块修改的公共文件,或者是同一组文件(模块),这并不完全清楚有多个版本。

如果您无法生成同时修改的那些文件,那么branches are the right solution,这就是为什么 SVN 或任何 DVCS(Git、Mercurial、...)
这将增加合并的开销,以便将您的一些修改从一个分支报告到另一个分支。


您想要的选择性合并是“负合并”(您可以反转某些更改而不是其他更改:也称为 subtractive merge

Git 通过 "rebase --interactive" 毫无问题地处理该问题,您可以在其中重放提交(您甚至可以修改/更改重放的提交之一)。
如果您不想重写过去提交的历史记录,您还可以选择git revert

我不知道 RCS 会如何处理这个问题,除非您通过手动比较当前版本与 A 完成的先前版本来进行新修订,以删除正确的行。

【讨论】:

  • 感谢您的 cmets,但配置只是一个示例。更准确地说,模型文件是我们现在共享的内容,我们无法将它们分开。所以团队中的所有成员都在不断地编辑它们。
  • @user397232:你没有办法生成这些模型文件,而不是对它们进行版本控制?
  • @user397232:那么分支是要走的路:我已经完成了我的答案。
  • 感谢 VonC。阅读您的答案后,我意识到我的问题有多么模糊,我已经对其进行了编辑。对不起。如果您能重新阅读我的问题并告诉我您的想法,我将不胜感激。
  • @user397232:是的,我已经完成了我的回答,并提供了有关恢复某些选择性更改的其他信息。
【解决方案2】:

一般来说,使用版本控制的方法是这样的:

  • 你有一个带有稳定版本代码的主干
  • 你有一个问题 -> 你从你的主干创建一个分支
  • 在解决问题时,您将更改从主干更新到您的分支,以尽可能接近稳定版本 -> 这样您会立即注意到稳定版本的更改不适用于您的代码;)
  • 一旦问题得到修复/测试(!),您将分支合并到主干

注意:

  • 如果有更多开发人员更改同一行代码,则会出现冲突 -> 发生这种情况,必须手动处理
  • 也可以恢复提交

【讨论】:

    【解决方案3】:

    要删除带有 SVN 的版本(我假设这与 git 类似),您可以在工作副本上使用以下命令行:

    svn merge -c -4 .
    

    这会将版本 4 的更改负面地应用到您的工作副本。之后,您可以检查更改并将其提交回存储库。

    【讨论】: