是否正在创建git diff补丁,然后在应用有效工作流程之前手动编辑?

时间:2012-05-06 19:24:05

标签: git merge workflow integration major-upgrade

好的有2个项目,A& B.我正在研究'B'的项目是'A'的下游。也就是说,B增加了不同的特征并且在与A不同的方向上成长。但是它们有着共同的历史。

不久前B维持了A的每个主要版本的定期更新。但现在不再是这种情况了。

在追踪B中的内存泄漏时,我发现它已在一年前修复了A&然后对A进行了很多改变以提高性能。

决定将所有这些变化整合到项目B中。

所以这就是我现在正在做的事情。显然,有很多困难使得任务难以管理。但它们都没有真正与我的问题有关。

我开始按组件创建diff的组件,以查看更改的内容&决定可以包含哪些内容而不破坏B中不存在于A中的特征。

我为每个组件创建了一个新分支(为了使其更易于管理 - 确定哪些内容包含更改代码在特定组件之外的代码)最初认为我可以进行合并,我似乎记得在使用之前使用合并。它会产生冲突而不是写东西;但无论出于何种原因,当我尝试将A中的一个组件与B合并时,大部分B的特有代码都丢失了。

虽然有什么可行的,但我还是犹豫是否花时间研究一种我不知道的可能陷阱的技术,就是编辑从差异中创建的补丁。

然后应用已编辑的补丁。

因为在补丁中我可以并排看到代码的两面,所以我可以删除不希望删除代码的位( - ),并根据具体情况担心冲突。

有人试过吗?或者有没有人知道处理这类问题的更主流技术?

另一个问题是,如果一个补丁没有被git系统破坏,它怎么能改变?

1 个答案:

答案 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的主要优势:轻松分支和合并。你将留下的几乎是手动修补系统,这总是很痛苦。但是,如果您可以每年更新一次或两次上游回购,则可能值得执行以下操作:

  • 从版本upstream / master开始,将您的提交应用于它(=>您的master-1分支)
  • 在需要时来自上游/主人的cherry-pick修补程序
  • 当你有时间更新到上游分支时,将master-1分支重新绑定到upstream / master上,但没有已经挑选过的修补程序(你可以使用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)