2

一点背景。我工作的实验室里有一堆自制软件。许多项目源于相同的来源,但没有版本历史记录。在某些时候,其中几个被分叉用于不同的实验目的。我们正在将所有这些软件放入 git 存储库中。希望这将使我们能够在未来合并不同的版本。

因此,我必须为 project1 versionA 创建一个新的 git 存储库并调用该主分支。

然后我希望 project1 versionB 成为同一个 git 存储库的一个分支。

不过,我还没有找到很好的解决方案。到目前为止,我最好的想法是:

git init(在 project1 versionA 中)目录,然后提交并推送到远程存储库。然后将其拉到版本B所在的同一台计算机上的一个新的空文件夹中。然后,我签出一个名为 versionB 的新分支,并将该版本中的所有内容复制到版本 A 之上。然后我提交 -a 并推送。

那应该在 git 中给我两个版本/分支。一个称为 master (versionA),一个称为 versionB。除了不是一个简洁的解决方案之外,这个问题还在于版本A中存在但版本B中不存在的任何文件现在都将存在于两者中。这肯定会造成混乱,并且由于许多软件会查看某些文件夹并将所有内容加载到那里,这将是个问题。

另一个想法是在复制之前从版本 B 分支中清除版本 A 的东西,这会解决问题吗?

这似乎是一种迂回的方式来做一些应该相当简单(并且经常遇到)的事情?

4

3 回答 3

2

它们都是具有不同版本的“project1”,您预计这两个版本之间会有很大的重叠。我会这样做(这有点不标准)。假设您有两个目录,一个称为verAsrc,另一个称为verBsrc。

$ cd verAsrc
$ git init
$ git branch versionA master
$ git branch versionB master
$ git checkout versionA
$ git add
$ git commit -m 'Project 1 version A'

# now the non-standard part

$ cd verBsrc
$ ln -s verAsrc/.git .git
$ git symbolic-ref HEAD refs/heads/versionB      # change to versionB w/o touching working files
$ git add -A
$ git commit -m 'Project 1 version B'

# Now you are done with verBsrc

$ cd verAsrc
$ git symbolic-ref HEAD refs/heads/versionA

现在您在 verAsrc 中有一个 git 存储库,它在自己的分支上同时具有版本 A 和 B。您可以检查任何一个。他们现在独立了;但是,这里是关键,你想从版本 A 变基版本 B。

$ git checkout versionB
$ git rebase versionA

GIT 将识别所有共享的内容,并在 versionA 上生成一个提交,将您带到 versionB。该单一提交将具有 A 和 B 之间的所有差异

$ git diff versionA..versionB

去应该不错。合并您想要掌握的内容。在 verAsrc 中克隆存储库。

于 2012-04-16T17:45:03.047 回答
2

另一个想法是在复制之前从版本 B 分支中清除版本 A 的东西,这会解决问题吗?

或多或少。在您提交并推送您的主分支后,创建和checkout versionB. 现在git rm .(即,清空目录),复制 versionB 的东西,然后提交 + 推送。这可能会为第一个版本 B 创建一种混乱的提交记录;OTOH它可能不是 - 但这只是“修改后的文件A”和“删除的文件A,新的文件文件A”之间的区别(我以前做过,但我不记得这方面的结果)。

实际上:如果您改为覆盖git rm您不需要的文件,而不是先将它们全部删除(除非这太乏味),可能会更好。

于 2012-04-16T16:59:20.463 回答
1

据我了解,您正在这样做:

project1 repository
   versionA branch   A
   versionB branch    \--- B

基本上 versionB 是从 versionA 分支的(我猜是 master 分支),您甚至将 versionA 的文件留在了 versionB 分支中,因为您只是“复制了它”。提交 A 是您的第一个提交。

由于您丢失了项目历史记录并且您没有他们分叉的代码,因此我建议您从空提交分支。

project1 repository
   master            M
   versionA branch   |---A
   versionB branch   \---B

提交 M 将是您的初始(空)提交(可能仅包括.gitignore文件或其他内容),提交 A 将仅包含来自 VersionA 的文件,而提交 B 将仅包含来自 VersionB 的文件。

于 2012-04-16T17:12:25.973 回答