Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/git/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/postgresql/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在应用有效的工作流之前,是否先创建git diff修补程序,然后再手动编辑?_Git_Merge_Workflow_Integration_Upgrade - Fatal编程技术网

在应用有效的工作流之前,是否先创建git diff修补程序,然后再手动编辑?

在应用有效的工作流之前,是否先创建git diff修补程序,然后再手动编辑?,git,merge,workflow,integration,upgrade,Git,Merge,Workflow,Integration,Upgrade,好的,有两个项目,A和B。我正在“B”上工作的项目在“A”的下游。也就是说,B为a添加了不同的功能,并朝着不同的方向发展。但它们有着共同的历史 不久前,在A的每一个主要版本中,B都会定期更新,但现在已经不是这样了 在跟踪B中的内存泄漏时,我发现它在一年多前在a中得到了修复&然后对a进行了大量更改以提高性能 决定将所有这些变更纳入项目B 这就是我现在正在做的。显然,有相当多的困难使任务难以管理。但它们都与我的问题无关 我开始一个组件一个组件地创建diff的组件,以查看发生了什么变化,并决定在不破坏

好的,有两个项目,A和B。我正在“B”上工作的项目在“A”的下游。也就是说,B为a添加了不同的功能,并朝着不同的方向发展。但它们有着共同的历史

不久前,在A的每一个主要版本中,B都会定期更新,但现在已经不是这样了

在跟踪B中的内存泄漏时,我发现它在一年多前在a中得到了修复&然后对a进行了大量更改以提高性能

决定将所有这些变更纳入项目B

这就是我现在正在做的。显然,有相当多的困难使任务难以管理。但它们都与我的问题无关

我开始一个组件一个组件地创建diff的组件,以查看发生了什么变化,并决定在不破坏B中不存在于A中的特性的情况下可以包含什么

我为每个组件创建了一个新的分支(为了使它更易于管理——识别在特定组件之外对已更改代码的引用是什么),最初我认为我可以进行合并,我似乎记得以前使用过合并&它会产生冲突,而不是过度编写内容;但无论出于什么原因,当我试图将a中的组件与B合并时,B特有的大部分代码都丢失了

不过,如果我不想花时间在一项我不知道的可能出现坑落的技术上,那就只需要编辑由差异创建的补丁

然后应用编辑过的补丁

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

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


另一个问题是如何修改补丁而不被git系统损坏

我建议您不要编辑git补丁,而是选择感兴趣的提交,并在工作目录中修改应用的差异:

git cherry-pick --no-commit upstream/commit1
(edit changes in working directory)
git commit
如果您有很多潜在的有趣的提交,您可以尝试交互式重基

git checkout upstream/master -b upstream-new
git rebase -i master
通过这种方式,您可以轻松地查看和选择许多提交—例如,只选择仅影响子系统的提交。您可以通过运行一个
git日志--oneline subsystem1/>/tmp/subsystem1\u commits.txt
-来帮助选择过程,它将创建一个与
git rebase-i
接受的语法类似的文件

关于你的工作流程:我认为你的问题没有一个简单的解决方案。如果上游存储库和您的分支长期分离,您将失去git的主要优势:易于分支和合并。您将留下的几乎是手动修补系统,这总是一个痛苦。但如果你能一年更新一到两次上游回购协议,可能值得做以下事情:

  • 从版本上游/主版本开始,对其应用您的提交(=>您的主版本1分支)
  • 需要时,请从上游/主服务器上选择修补程序
  • 当您有时间更新到上游分支时,将master-1分支重新设置到上游/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)

与其编辑git修补程序,我建议cherry选择感兴趣的提交,并在工作目录中修改应用的差异:

git cherry-pick --no-commit upstream/commit1
(edit changes in working directory)
git commit
如果您有很多潜在的有趣的提交,您可以尝试交互式重基

git checkout upstream/master -b upstream-new
git rebase -i master
通过这种方式,您可以轻松地查看和选择许多提交—例如,只选择仅影响子系统的提交。您可以通过运行一个
git日志--oneline subsystem1/>/tmp/subsystem1\u commits.txt
-来帮助选择过程,它将创建一个与
git rebase-i
接受的语法类似的文件

关于你的工作流程:我认为你的问题没有一个简单的解决方案。如果上游存储库和您的分支长期分离,您将失去git的主要优势:易于分支和合并。您将留下的几乎是手动修补系统,这总是一个痛苦。但如果你能一年更新一到两次上游回购协议,可能值得做以下事情:

  • 从版本上游/主版本开始,对其应用您的提交(=>您的主版本1分支)
  • 需要时,请从上游/主服务器上选择修补程序
  • 当您有时间更新到上游分支时,将master-1分支重新设置到上游/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)

谢谢你的详细回答。我不得不接受这次的痛苦。但这是一个更加主动的持续维护工作流程。(对于我来说,阅读Pro Git最后几章的时间已经过去了。)感谢您的详细回答。我不得不接受这次的痛苦。但这是一个更加主动的持续维护工作流程。(对我来说,阅读Pro Git最后几章的时间已经过去了。)