2

我是 git 新手(以及一般的版本控制),我正在尝试找出如何最好地实现我的工作流程。我正在从事一个(个人)项目,该项目涉及许多“永久”分支,即完全独立的程序,这些程序是从公共代码库中分叉出来的,永远不会合并到主分支中。(这是因为我是一名研究模拟模型的科学家,我正在尝试很多新事物,只是为了看看它们是否有有趣的结果。如果有,我目前复制整个项目文件夹,以便我可以稍后再回来。我的目标是使用 git 分支来代替。)

因为这些分支是永久性的,所以我想知道是否有一种简单的方法可以将我在一个分支中实现的功能转移到另一个分支,同时保留两个分支之间的差异。例如,假设我的存储库的树如下所示:

               model_a
              /
initial commit 
              \
               model_b

就我而言,model_a并且model_b正在使用大致相同的模拟代码来模拟两种不同的事物。它们可能在模拟代码的内部循环中的某些参数值和/或某些细节方面有所不同,但围绕它的一般“基础设施”将是相同的。现在,在工作时branch_a,假设我实现了一种可视化结果的新方法:

               model_a --- model_a_with_visualisation_code
              /
initial commit 
              \
               model_b

我想知道的是,有没有我可以输入的 git 命令,除非合并冲突,否则会导致:

               model_a --- model_a_with_visualisation_code
              /
initial commit 
              \
               model_b --- model_b_with_visualisation_code

换句话说,我只想获取用于变成 的提交model_amodel_a_with_visualisation_code并将这些提交的副本应用到model_b分支的末尾。或者至少,我认为这就是我想要的。

它看起来git rebase应该是我想要的工具,但我很难理解它,而且我找不到任何说明这个用例的例子。似乎也git rebase删除了旧版本的提交,而不是复制它们。

我希望这个问题很清楚。正如我所说,我是 git 新手,很多主要概念对我来说仍然有点模糊。例如,我不完全确定上述树中的标签是标签还是分支,还是只是提交。如果我误解了某些东西应该如何工作,我会很感激任何澄清。

4

3 回答 3

3

是的,这是可能的(请参阅其他答案),但我觉得您可能会尝试解决错误的问题。

与其在模型上分道扬镳,不如以一种可以在不同模型之间轻松切换的方式来构建模拟代码,同时保持库与所有周围代码和可视化共享,这可能是一个更好的主意。

您仍然可以在开始构建新模型时进行分支,但将所有代码重新合并在一起可能是有利的,这样最终您就有了一个模拟,您可以在其中只选择您想要运行的模型。

否则,一段时间后,您将拥有大量略有不同的分支,它们都包含不同的错误,并且您(可能)不再真正知道哪个是哪个。

于 2013-05-21T09:34:44.410 回答
2

cherry_pick用于应用由一些现有提交引入的更改。通过指定git cherry_pick [branch]您应该在您所在的当前分支中指定分支的尖端提交提交。

git checkout model_b
git cherry-pick model_a

文档

于 2013-05-21T09:19:39.027 回答
2

凯文的答案是正确的,如果这是偶尔的,这是一个很好的方法。但是,如果你期望得到很多这些变化,我发现不断挑选樱桃是一种 PITA。我建议您创建另一个分支,例如common. 应该进入两个分支的代码在这里,并被合并到model_aand model_b

model_a:          E->F->K
                  /     /
common: A->B->C->D---->I
                  \     \
model_b:          G->H->L
于 2013-05-21T09:31:04.987 回答