好的有2个项目,A& B.我正在研究'B'的项目是'A'的下游。也就是说,B增加了不同的特征并且在与A不同的方向上成长。但是它们有着共同的历史。
不久前B维持了A的每个主要版本的定期更新。但现在不再是这种情况了。
在追踪B中的内存泄漏时,我发现它已在一年前修复了A&然后对A进行了很多改变以提高性能。
决定将所有这些变化整合到项目B中。
所以这就是我现在正在做的事情。显然,有很多困难使得任务难以管理。但它们都没有真正与我的问题有关。
我开始按组件创建diff的组件,以查看更改的内容&决定可以包含哪些内容而不破坏B中不存在于A中的特征。
我为每个组件创建了一个新分支(为了使其更易于管理 - 确定哪些内容包含更改代码在特定组件之外的代码)最初认为我可以进行合并,我似乎记得在使用之前使用合并。它会产生冲突而不是写东西;但无论出于何种原因,当我尝试将A中的一个组件与B合并时,大部分B的特有代码都丢失了。
虽然有什么可行的,但我还是犹豫是否花时间研究一种我不知道的可能陷阱的技术,就是编辑从差异中创建的补丁。
然后应用已编辑的补丁。
因为在补丁中我可以并排看到代码的两面,所以我可以删除不希望删除代码的位( - ),并根据具体情况担心冲突。
有人试过吗?或者有没有人知道处理这类问题的更主流技术?
另一个问题是,如果一个补丁没有被git系统破坏,它怎么能改变?
答案 0 :(得分:1)
我建议不要编辑git补丁,而是选择有趣的提交,并修改工作目录中应用的差异:
git cherry-pick --no-commit upstream/commit1
(edit changes in working directory)
git commit
如果您有很多可能有趣的提交,可以尝试交互式rebase。
git checkout upstream/master -b upstream-new
git rebase -i master
通过这种方式,您可以查看& cherry-pick很多提交 - 例如,只选择只影响子系统的提交。您可以通过运行git log --oneline subsystem1/ >/tmp/subsystem1_commits.txt
来帮助选择过程 - 它将创建一个语法与git rebase -i
接受的文件类似的文件。
关于您的工作流程:我认为您的问题不是一个简单的解决方案。如果上游存储库和您的分支机构长时间分歧,您将失去git的主要优势:轻松分支和合并。你将留下的几乎是手动修补系统,这总是很痛苦。但是,如果您可以每年更新一次或两次上游回购,则可能值得执行以下操作:
git rebase -i
)。我们称这个分支为master-2。这样您将拥有以下历史记录:
A-A-A-A-A- (upstream/master at the beginning)
\
-B-B-A-B (your master-1 branch, with a cherry-pick)
\
-A-A-A-A-A-A-A-A -B-B-B (your master-2 branch, after the rebase)