如何使用git同时处理多个不同版本的文件?

如何使用git同时处理多个不同版本的文件?,git,branch,git-branch,Git,Branch,Git Branch,我目前正在开发我自己的神经成像工具箱,该工具箱在MATLAB/SPM8下运行,我的存储库中的大多数程序文件都是MATLAB*.m文件。我有不同的功能分支和一个analysis分支,用于使用当前版本进行持续分析。同时,我正在开发master和功能分支中的代码,然后不断地将这些分支合并到master分支中 现在的问题是,我在analysis分支中运行的分析确实需要很多时间(甚至几天),在这段时间内,我无法git checkout master或git checkout新功能。这严重限制了我的工作效率

我目前正在开发我自己的神经成像工具箱,该工具箱在MATLAB/SPM8下运行,我的存储库中的大多数程序文件都是MATLAB
*.m
文件。我有不同的功能分支和一个
analysis
分支,用于使用当前版本进行持续分析。同时,我正在开发
master
和功能分支中的代码,然后不断地将这些分支合并到
master
分支中

现在的问题是,我在
analysis
分支中运行的分析确实需要很多时间(甚至几天),在这段时间内,我无法
git checkout master
git checkout新功能。这严重限制了我的工作效率

因此,由于不可能同时打开多个分支,
我正在考虑将
分析
分支从开发存储库转移到它自己的存储库。问题是,如果我基于当前的
分析
分支创建了一个新的
git init
存储库,是否有办法时不时地从当前的
master
分支(开发存储库)合并
git
要能够在新的分析存储库中使用我的开发存储库的新开发代码?

如果
git克隆
现有存储库到新存储库中,则可以
git push
git fetch
从一个到另一个,以匹配已更改的引用(分支);不涉及合并。存储库的内容将自动硬链接以节省磁盘空间

如果您使用
--mirror
选项来
git clone
git push
,您将省去远程跟踪分支,而只是在这两个分支中都有相同的分支,这更简单、更对称,但与git的常规用法相比要少一些。为了最大限度地简化“遵循教程”的操作,请安排第三个“中心”存储库(应该创建
--bare
),这两个工作存储库都是它的克隆

不需要合并(除了“快进合并”之外,它不是真正的合并,而是用新的分支头替换旧的分支头),因为您正在处理相同的分支;你只有两份。当您的分析完成并且能够更新分析分支时,只需在
分析中执行
git merge--ff only master
;您可以在任何方便的存储库中执行此操作,但不要忘记使用
git-push-other存储库将更改同步回来


另一个选项(由于Git版本2.5)是命令,它允许多个独立的工作树,您可以在其中独立地
Git checkout
等。此选项与上面的克隆选项之间的区别在于,这里只有一组分支


然而(从2.8版开始),这仍然被认为是一个“实验性”功能,我个人没有用它来评论它的可靠性和实用性。

作为凯文·里德解释的复制回购协议的替代方案,您也可以使用
git new workdir
为您的回购协议创建第二个工作副本。这样,两个工作副本将始终自动看到相同的分支,因为它们共享一个git回购

与克隆回购协议相比,其优势在于无需任何手动同步/合并。在workdir A中提交时,提交将在workdir B中可见(例如,
git log

唯一需要注意的是:当您更改存储库(提交、重定基址、重置分支等)时,您不应该在另一个workdir中签出同一个分支,否则git会有点困惑(请参阅)


请参阅:

这似乎是个好主意。如果我
git clone
我的存储库(没有
--mirror
,因为我使用Dropbox作为专用远程跟踪存储库,如上所述),我仍然可以创建新的分支并同步它们吗?如果我创建了一个新的功能分支,我是否应该在我的
原始
存储库和新的
分析
存储库中使用相同的名称创建它?或者,如果我总是只将
original
存储库的
master
分支合并到新的
analysis
存储库中,那么只在
original
存储库中创建它就够了吗?如果您对
analysis
分支所做的唯一一件事就是从
master
合并到
analysis
,那么是的,该分支不需要位于分析存储库之外的任何位置。事实上,它不需要被认为是一个单独的分支:它只是该存储库中唯一的分支,上游是
origin/master
。您对它所做的每一次合并都应该是快速的。谢谢,这对我帮助很大。从旧的(开发)repo(
origin/master
)合并到分析repo:在新的
git clone
'd存储库中(不带
--mirror
或任何其他特殊标志)
git merge master
(带或不带
--ff
标志)失败:
fatal:“master”不指向提交
,而
git merge--ff only origin/master
给出了
致命:不可能快进,中止。
(我认为
--ff only
失败,因为
分析
分支也有它自己与分析参数等相关的提交),但是无论如何,
git merge origin/master
工作得很好,使用“递归”策略进行合并。实际上,您可以同时打开多个分支: