什么是一些简单/好的方法来最终合并两个源目录?

时间:2009-07-10 21:46:00

标签: svn git version-control merge diff

我有一个源目录,其中包含不同语言和文件的混合。可能有100多个文件。我想'fork'代码并创建一个完全不同的源代码版本。此时,我将拥有代码的第1版和代码的第2版。我不会在版本1上做那么多的开发。我想更改文档标题和其他一些小的更改。我将在版本2上进行大量开发,然后在一两个月之后再回来并将版本-2与版本1合并(将最新版本-2设置为版本-1)。

但是,我不想丢失我对版本1所做的任何更改(比如经过数月的小修复)。


以下是我想要的其他条件。

  1. 我不想像subversion那样集中版本控制(无论如何这个源都不在subversion下)。

  2. 我以为我可以使用'git',然后在版本1和版本2上执行git。在版本1上进行开发,然后在版本2上进行两个月的开发,然后与git进行合并。

  3. 我唯一关心的是git。 答:理想情况下,我希望在'我已经在一个时刻对版本1和版本2完成所有开发之后创建git存储库',比如在两个回购开发两个月之后。我宁愿这样做一次git创建存储库,以便我可以避免做一堆增量提交?

    B中。我想我需要合并时可能需要一些git GUI工具? git有没有任何工具。

    ℃。我讨厌.git存储库文件,我必须在两个repos上完成所有开发之后删除所有这些文件。可能很难清除这些。

    ...回到我编号的选项。

    1. 使用diff和patch命令。我真的很讨厌这样做,因为duff / patch似乎很基本。

    2. 其他一些合并工具?

5 个答案:

答案 0 :(得分:3)

虽然我不同意你在开发2个月之后不创建存储库的立场,但是你可能会发现一个用于合并整个目录的工具是Beyond Compare。 Beyond Compare让你进行文件夹比较。

以下是Beyond Compare comparing folders的截图。

答案 1 :(得分:3)

您的情况被称为“分支”,是源控制系统的基本概念之一。

使用SVN(或Git,或Hg,或CVS,或......)完成工作,并完成正确

答案 2 :(得分:3)

git只创建一个单个.git目录。 svn是在每个目录中分散.svn目录的那个。

花在学习有用的git命令(例如git merge --squash)上的时间会更好。使用git,它可以毫无困难地完成您想要的操作。


修改

使用git,您可以将它们保存在一个地方,随心所欲地来回切换,并根据需要进行多次提交。

为了减少冲突,您可能希望将Phase1合并到Phase2中(因为您在Phase1中进行了不频繁的更改)。但这完全取决于你。

以下是我将如何使用git:

cd /path/to/project
git init
git add .
git commit -m "Initial Commit"

此时,您在主分支上有一个名为“Initial Commit”的提交。现在,让我们创建分支。

git branch Phase1
git branch Phase2

现在,要处理第2阶段:

git checkout Phase2
... work ...
git add ...
git commit

切换到第1阶段并做一些工作。

git checkout Phase1
... work ...
git add ...
git commit

切换到第2阶段并做更多工作。

git checkout Phase2
... work ...
git add ...
git commit

在适当的时候,将阶段1的变化拉到阶段2(或者相反):

git checkout Phase2
git merge Phase1
... resolve any conflicts and commit if needed ...

重复...您将能够根据需要制作尽可能多的提交,合并和分支。

此外,使用git tag ...创建指向给定提交的标记。通过这种方式,您可以随时返回而无需查看历史记录。


修改

我们从命令行运行git,所以我不熟悉GUI工具的存在。它应该不难找到。

当您遇到冲突时,git会将文件标记为冲突(git status)并尽可能合并它们。如果合并无法完成,则会在文件中留下非常清晰的标记:

<<<<<<< yours:sample.txt
Conflict resolution is hard;
We went shopping yesterday.
=======
We go shopping today.
>>>>>>> theirs:sample.txt

所以你只需删除其中一个,然后编辑其余部分以适应。

它很少发生并且很容易清理。

答案 3 :(得分:1)

关于不使用subversion或类似的版本控制工具,你说你不想使用它?为什么?这将是您解决问题的理想方案。

其次你说你不想使用diff和patch,你明白很多版本控制系统都使用你所说的非常基本的差异和补丁工具;)

第三,如果您找到了更好的“差异和补丁工具”,则必须执行以下操作

diff V1_start V1_end&gt; patch_file;补丁V2_end patch_file。

因此,你仍然必须保留旧版本的V1软件(否则你永远不会做差异!)。而不是手动执行此操作,为什么不使用版本控制系统来跟踪版本?

答案 4 :(得分:0)

我不完全清楚它是否是你想要的,但是Git可以合并独立项目/独立分支,这些分支没有共同的祖先。例如git本身就是git的git代码和邮件工具的合并(在git的早期历史中)。