我是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_a
转换为model_a_with_visualisation_code
的提交,并将这些提交的副本应用到model_b
分支的末尾。或者至少,我认为这就是我想要的。
看起来git rebase
应该是我想要的工具,但是我很难理解它,而且我找不到任何说明这个用例的例子。似乎git rebase
删除旧版本的提交,而不是复制它们。
我希望问题很清楚。正如我所说,我是git的新手,而且很多主要概念对我来说仍然有些模糊。例如,我不完全确定上述树中的标签是标签还是分支或只是提交。如果我误解了某些事情应该起作用,我会感激任何澄清。
答案 0 :(得分:3)
是的,这是可能的(见其他答案),但我觉得你可能会尝试解决错误的问题。
您可以更好地构建模拟代码,以便在不同模型之间轻松切换,同时保持库与所有周围代码和可视化共享。
在开始构建新模型时,您仍然可以分支,但将所有代码重新合并在一起可能是有利的,这样最终您只需要一个模拟,您可以选择所需的模型那跑。
否则,经过一段时间后,你会有一大堆略有不同的分支,它们都包含不同的bug,而你(可能)不知道哪个是哪个。
答案 1 :(得分:2)
cherry_pick
用于应用某些现有提交引入的更改。通过指定git cherry_pick [branch]
,您应该在当前分支的指定分支的尖端提交提交。
git checkout model_b
git cherry-pick model_a
答案 2 :(得分:2)
Kevin's answer是正确的,如果这是偶然的话,这是一个很好的方法。但是,如果你期望得到很多这些变化,我发现不断采摘樱桃就是PITA。我建议您创建另一个分支,例如common
。应该进入两个分支的代码都在此处,并合并到model_a
和model_b
:
model_a: E->F->K
/ /
common: A->B->C->D---->I
\ \
model_b: G->H->L